并不是所有的类都可以被继承,不能继承的类称为密封类,用关键字sealed。
适用场合:
如果要对库、类或自己编写的其他类进行操作,则重写某些功能会导致编译错误。
因为商业原因把类或方法标记为sealed,以防第三方以违反注册协议的方式扩展该类。
注意:
密封类中不能包含虚方法(Virtual)和抽象方法(abstract),因为在密封的类没有为派生类提供实现其虚方法和抽象方法的机会。
在把类或方法标记为sealed时要小心,因为这么做会严重限制它的使用。即使不希望它能继承一个类或重写类的某个成员,仍有可能在将来某个时刻,有人会遇到没有预料到的情形。
.NET基类库大量使用了密封类,使希望从这些类中派生出自己的类的第三方开发人员无法访问这些类,例如string就是一个密封类。
定义:用修饰符sealed进行标记的方法
作用:使用sealed修饰符可以防止派生类进一步重写该方法
注意:如果实例方法声明包含sealed修饰符,则它必须也包含override修饰符。
要在方法中使用sealed关键字,必须先在基类上将其声明为重写。如果基类上不希望有重写的方法或属性,就不要将其声明为virtual。
密封类除了不能被继承外,其他与非密封类一样,密封方法则必须通过重写基类中的虚方法来实现。
Talk is cheap,show you the code.
class Program
{
static void Main(string[] args)
{
Class2 myclass2 = new Class2();
myclass2.Write();
Console.ReadKey();
}
}
public/*基类的可访问性一定要高于子类的,平级也可以*/class Class1
{
public virtual void Write()
{
Console.WriteLine("未密封方法");
}
}
//如果一个类不希望将来在使用的过程中被继承,被派生,这时候可以采用关键字sealed
//虚方法virtual 抽象方法abstract的存在就是为了继承,为了派生,因此不能被放在sealed类中
public class Class2:Class1
{
public sealed override void Write()
{
Console.WriteLine("密封方法");
}
}
public class Class3:Class2
{
/* public override sealed void Write()
{
在Class2中该方法被密封,无法重写。
}*/
}