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中
}
6.并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现并提供具体的实 现,所以,声明密封方法时,sealed总是和override同时使用。
如2.中的例②。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。