0、参考
(1)讲的较好:https://blog.csdn.net/XVJINHUA954/article/details/106876099
(2)官方地址:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/sealed
以下C#语言讲解,描述(以后有空讲一下java)
1、功能和特点
1.1功能
sealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写
1.2特点
- (1)sealed修饰符不能和 abstract 同时使用,因为抽象类必须由提供抽象方法或属性的实现的类来继承,密封类不能同时又是抽象类,因为抽象总是希望被继承的。当然sealed也不能修饰接口(interface)
- (2)sealed修饰符应用于方法或属性时,(密封)sealed修饰符必须始终与(重写)override结合使用(这是指对virtual的重写)
- (3)sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员。
1.3作用
- 在类声明中使用sealed可防止其它类继承此类,
- 在方法声明中使用sealed修饰符可防止扩充类重写此方法,
- sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化,
- 密封类中永远不可能有任何派生类。如果密封类实例中存在虚拟成员函数,该成员函数可以转化为非虚的,函数修饰符virtual 不再生效。
2、Sealed测试例子
2.1密封类的测试例子
注意:类密封后,整个类不能再继承了
(1)基本用法
public sealed class XXX
{
//..............................
}
(2)简单例子
class a { }
sealed class b : a { }
//下面语句报错,无法从一个密封类继承
class c : b { }
报错原因
2.2密封方法
注意:对方法密封后,无法重写。正确用法:只能对virtual方法的重新使用sealed,也就是只能是:sealed override XXX()
对方法可以使用sealed 修饰符,这时我们称该方法是一个密封方法
- 不是类的每个成员方法都可以作为密封方法,要作为密封方法必须对父类的虚拟方法进行重写,提供具体的实现方法。
- 所以,在方法的声明中,sealed 修饰符总是和override 修饰符同时使用。
(1)测试例子,不可以直接对方法密封,会报错,如下所示
public class demoA
{
//直接这么用会出错!!!
public sealed void Run()
{
Console.WriteLine("--run---");
}
}
报错如下
(2)正确用法:可以通过对虚函数的重新进行密封,如下所示
1)下面是正确的方法
public class demoA
{
public virtual void Run()
{
Console.WriteLine("-run--");
}
}
public class demoB:demoA
{
//正确使用,密封后,无法再重写
public sealed override void Run()
{
Console.WriteLine("-run sealed--");
}
}
class MasterClass
{
public static void Main()
{
demoA demo = new demoB();
demo.Run();
}
}
2)密封后无法继承,否则出错
public class demoA
{
public virtual void Run()
{
Console.WriteLine("-run--");
}
}
public class demoB:demoA
{
//正确使用,密封后,无法再重写
public sealed override void Run()
{
Console.WriteLine("-run sealed--");
}
}
public class demoC : demoB
{
//因为demoB中该方法已经密封,无法继承
public override void Run()
{
Console.WriteLine("-run sealedCC--");
}
}
出错信息如下