C#中使用关键字sealed,将类和方法声明为密封类或者密封方法;
sealed class A //密封类 { } public sealed override void N() //密封方法 { Console.WriteLine(); }2.对于密封类来说,表示该类不能被继承;对于密封方法来说,表示该方法不能被重写;
例①:
//对于密封类来说,表示该类不能被继承 sealed class A { } class B : A //错误提示:B无法从密封类型A派生 { }例②:
class A { public virtual void M() { Console.WriteLine("M()方法被调用!"); } public virtual void N() { Console.WriteLine("N()方法被调用!"); } } class B : A { public override void M() { Console.WriteLine("M()方法被重写!"); } public sealed override void N() { Console.WriteLine("N()方法被重写并被密封!"); } } class C : B { public override void M() //B重写了A中的N方法而且没有密封,C就可以重写B中的N方法了 { Console.WriteLine("M()方法!"); } public override void N() //报错,B重写了A中的N方法并密封,C就无法重写B中的N方法了 { } }3.密封类不能作为基类被继承,但它可以继承别的类或借口;
interface D //声明一个接口 { } sealed class A : B //密封类可以继承其他非密封类 { } sealed class C : D //密封类可以继承接口 { } class B : A // 报错,B无法从密封类型A派生,密封类不能被继承 { }4.密封类不能被声明为抽象的,因为抽象类总希望被继承,而密封类不能被继承。(sealed和abstract不 能修饰一个类名)
sealed abstract class A //抽象类不能同时又是密封的或者静态的 { }5.在密封类中不能声明受保护成员(声明了也不报错)、虚成员、抽象成员,因为受保护成员只能从派生 类进行访问,而虚成员只能在派生类中重写,非抽象类中不能有抽象方法。
sealed class A { protected void B() //不报错,密封类中声明了新的保护成员 { } public virtual void C() //报错,错误提示: C是密封类A中的虚拟成员 { } public abstract void D(); //报错,错误提示: D是抽象的,但是它包含在非抽象类A中 }