C#密封类与密封方法

01

前言

       如果所有的类都可以被继承,那么很容易导致继承的滥用。进而使类的层次结构体系变得十分复杂,这样使开发人员对类的理解和使用变得十分困难。为了避免滥用继承,C#中提出了密封类的概念。下面将对类和方法的密封进行详细介绍。

02

密封类概述及声明

密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应密封类型和成员。密封可以防止对库的类型和成员进行自定义,但也会影响某些开发人员对可用性的认识。

C#中使用密封类时,如果类满足如下条件,则应将其密封。

70603b4afbd72f7fc56dc6d7d2eda427.png类是静态类。

62f357513aa0cf9e8a6a502599f0f314.png类包含带有安全敏感信息的继承的受保护成员。

bc79e8e27b1746824ef0a4f4df197fb0.png类继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类。

286125e1a0d587bf0f4b4a39398f9370.png类是一个要求使用反射进行快速搜索的属性。密封属性可提高反射在检索属性时的性能。

C#中声明密封类时需要使用sealed 关键字,具体语法格式如下:

访问修饰符sealed class 类名:基类或接口
{
//类成员
}

说明

① 密封类不能作为基类被继承,但它可以继承别的类或接口。

② 在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写。

③ 由于密封类的不可继承性,因此密封类不能声明为抽象的,即 sealed 修饰符不能与abstract 修饰符同时使用。

【例 1】声明一个密封类,该密封类中包含一个int类型的变量和一个无返回值类型的方法,它们只能通过实例化密封类的对象来访问,而不能被继承。

代码如下:

public sealed class myClass      /  /声明密封类 
{
public int =0;
public void method()
{
Console.WriteLine(“密封类”);
}
}

03


密封方法概述及声明

       并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现,并提供具体的实现。所以,声明密封方法时,sealed 修饰符总是和 override 修饰符同时使用。

【例2】声明一个类myClass1,该类中声明一个虚方法Method,然后声明一个密封类 myCtass2,该类继承自myClass1类,在密封类 myClass2 中密封并重写 myClass1类中的虚方法Method。

代码如下:

public class myClass1
{
public virtual void Method()
{
Console.WriteLine("基类中的虚方法”);
}
}
public sealed class myClass2:myClass1
{
public sealed override void Method()  //密封并重写基类中的虚方法 Method 
{
base.Method();
Console.WriteLine(“密封类中重写后的方法”);
}
}

说明上面的代码中,密封并重写基类中的虚方法Method时,用到了“base.Method();”语句,该语句表示调用基类中的Method方法。base 关键字主要是为派生类调用基类成员提供一种简写的方法。

04


密封类与密封方法的使用

密封类除了不能被继承外,与非密封类的用法大致相同,而密封方法则必须通过重写基类中的虚方法来实现。下面通过一个实例讲解如何在程序中使用密封类和密封方法。

【例3】创建一个控制台应用程序,其中声明一个类myClass1。该类中声明了一个虚方法 ShowInfo,用来显示信息。然后声明一个密封类myClass2,继承自myClass1类,在myClass2 密封类中声明两个公共属性,分别用来表示用户编号和名称。接着密封并重写myClass1 基类中的虚方ShowInfo,并提供具体的实现,最后在主程序类 Program 的 Main 方法中实例化MyClass2 密封类的一个对象,然后使用该对象访问myClass2密封类中的公共属性和密封方法。

代码如下:

public class myClass1
{
public virtual void ShowInfo()     //虚方法,用来显示信息 
{
}
}
public sealed class myClass2 : myClass1   / /密封类,继承自 myClass1
{
private string id=“”;//string类型变量,用来记录编号
private string name=“”;//string类型变量,用来记录名称
public string ID             //编号属性
{
get
{
return id;
}
set
{
id = value;
}
}
public string Name        / /名称属性 
{
get
{
return name; 
       }
       set
       {
name= value; 
       }
}
public sealed override void ShowInfo()  //密封井重写基类中的 ShowInfo 方法 
{
Console.WriteLine(ID +””+ Name);
}
}
class Program
{
static void Main(string[] args)
{
myClass2 myclass2 = new myClass2();//实例化密封类对象 
myclass2.ID=”BH0001”;        //为密封类中的编号属性赋值 
myclass2.Name =“TM”;        //为密封类中的名称属性赋值 
myclass2.ShowInfo();            //调用密封类中的密封方法 
}
}

运行结果为 BH0001 TM。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值