目录
如果所有的类都可以被继承,很容易导致类的层次结构变得十分复杂。使对类的理解和使用变得十分困难。为了避免滥用继承,C#中提出了密封类的概念。
密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应密封类型和成员。
- C#中使用密封类时,如果类满足如下条件,则应将其密封:
- ☑ 类包含带有安全敏感信息的继承的受保护成员。
- ☑ 类继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类。
- ☑ 类是一个要求使用反射进行快速搜索的属性。密封属性可提高反射在检索属性时的性能。
- C#中声明密封类时需要使用sealed关键字,具体语法格式如下:
- 访问修饰符 sealed class 类名:基类或接口
- {
- //类成员
- }
声明一个密封类myClass2,继承自myClass1类,在myClass2密封类中声明两个公共属性,分别用来表示用户编号和名称,然后密封并重写myClass1基类中的虚方法ShowInfo(),并提供具体的实现。最后在主程序类Program的Main()方法中实例化MyClass2密封类的一个对象,然后使用该对 象访问myClass2密封类中的公共属性和密封方法。
- // 密封类和密封方法
- namespace _05
- {
- public class MyClass1
- {
- public virtual void Showlnfo() //虚方法,用来显示信息
- {
- }
- }
-
- 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 Showlnfo() //密封并重写基类中的Showlnfo()方法
- {
- Console.WriteLine(ID + "" + Name);
- }
- }
-
- class Program
- {
- static void Main(string[] args)
- {
- MyClass2 myclass2 = new() //实例化密封类对象
- {
- ID = "BH0001", //为密封类中的编号属性赋值
- Name = "TM" //为密封类中的名称属性赋值
- };
- myclass2.Showlnfo(); //调用密封类中的密封方法
- }
- }
- }
- //运行结果:BH0001TM