C#中seale关键字用法总结
来源:互联网 发布:优化排名 编辑:程序博客网 时间:2024/05/16 15:59
1.密封类与密封方法
如果所有的类都可以被继承,那么很容易导致继承的滥用,进而使类的层次结构体系变得十分复杂,这样使得开发人员对类的理解和使用变得十分困难,为了避免滥用继承,C#中提出了密封类的概念。
密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应密封类型和成员。密封可以防止对库的类型和成员进行自定义。
2. 密封类的声明
C#中声明抽象类时需要使用sealed关键字,具体语法格式如下。
访问修饰符 sealed class 类名:
基类或接口
{
//类成员
}
说明:① 密封类不能作为基类被继承,但它可以继承别的类或接口。
② 在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写。
③ 由于密封类的不可继承性,因此密封类不能声明为抽象的,即sealed修饰符不能与abstract修饰符同时使用。
示例e:
public sealed class myClass //声明密封类 { public int a = 0; public void method() { Console.WriteLine("密封类"); } }
3. 密封方法声明以及定义
并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现,并提供具体的实现,所以,声明密封方法时,sealed修饰符总是和override修饰符同时使用。
下面代码声明一个类myClass1,该类中声明一个虚方法Method,然后声明一个密封类myClass2,该类继承自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关键字主要是为派生类调用基类成员提供一种简写的方法。
密封类除了不能被继承外,与非密封类的用法大致相同,而密封方法则必须通过重写基类中的虚方法来实现。下面通过一个实例讲解如何在程序中使用密封类和密封方法。
创建一个控制台应用程序,其中声明一个类myClass1,该类中声明了一个虚方法ShowInfo,用来显示信息。然后声明一个密封类myClass2,继承自myClass1类,在myClass2密封类中声明两个公共属性,分别用来表示用户编号和名称,然后密封并重写myClass1基类中的虚方法ShowInfo,并提供具体的实现。最后在主程序类Program的Main方法中实例化MyClass2密封类的一个对象,然后使用该对象访问myClass2密封类中的公共属性和密封方法。程序代码如下
public class myClass1 { /// <summary>/// 虚方法,用来显示信息/// </summary> public virtual void ShowInfo() { } } public sealed class myClass2 : myClass1 //密封类,继承自myClass1 { private string id = ""; //string类型变量,用来记录编号 private string name = ""; //string类型变量,用来记录名称 /// <summary>/// 编号属性/// ///</summary> public string ID { get{return id;}set{id = value;} } /// <summary>/// 名称属性/// </summary> public string Name { get{return name;} set{name = value;} } /// <summary>/// 密封并重写基类中的ShowInfo方法/// /// </summary> public sealed override void 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结果为BH0001 TM运行结果为BH0001 TM。运行结果为BH0001 TM。运行结果为BH0001 TM。结果为BH0001 TM
sealed 修饰方法或属性
能够允许类从基类继承,并防止它们重写特定的虚方法或虚属性。
1)sealed是对虚方法或虚属性,也就是同override一起使用,如果不是虚方法或虚属性会报出错误:cannot be sealed because it is not an override
public class D{ /* ConsoleApplication1.MSFun.Sealed.D.M()' * cannot be sealed because it is not an override */ public sealed void M() { Console.WriteLine("D.M()"); }}
2)防止子类重写特定的方法或属性2)防止子类重写特定的方法或属性
public class A{ protected virtual void M() { Console.WriteLine("A.M()"); } protected virtual void M1() { Console.WriteLine("A.M1()"); }}public class B : A{ protected sealed override void M() { Console.WriteLine("B.M()"); } protected override void M1() { Console.WriteLine("B.M1()"); }}public sealed class C : B{ /* ConsoleApplication1.MSFun.Sealed.C.M()': * cannot override inherited member 'ConsoleApplication1.MSFun.Sealed.B.M()' * because it is sealed */ //protected override void M() { Console.WriteLine("C.M()"); } protected override void M1() { Console.WriteLine("C.M1()"); }}
- C#中seale关键字用法总结
- c#中unsafe关键字用法
- C#中var关键字用法
- C#中var关键字用法
- C#中using关键字用法
- C#中var关键字用法(收藏)
- C#中static关键字的用法
- C#中seal关键字两种用法
- C#中new 关键字的用法
- C#中param关键字的用法
- 浅谈c#中var关键字用法
- C#中常用关键字的用法
- Java中static关键字用法总结
- Java中final关键字用法总结
- Java中static关键字用法总结
- Java中static关键字用法总结
- Mysql中EXISTS关键字用法、总结
- Java中final关键字用法总结
- 前台线程与后台线程及线程池中等待子线程结束
- 十七
- android Eclipse 快捷键
- 面向对象
- 小白书--求 n!
- C#中seale关键字用法总结
- 计算结构体的大小
- 线程传参 构造法
- 转[Android]APK打包过程详解(二)
- linux文件编程- C库
- Ueditor在ASP.NET的配置说明
- EL取Map在tomcat6与tomcat7中的不同表现
- c++面试题3
- 浅析Tomcat、JBOSS、WebSphere、WebLogic、Apache