cs#sealed
关键字在C#中主要用于以下两个方面:
- 在类声明中使用sealed可指定该类为密封类,防止其它类继承此类。
- 在方法声明中使用sealed可指定该方法为密封方法,防止子类覆盖此方法。
下面来分别介绍一下密封类和密封方法。
密封类
密封类无法被其它类继承,如果试图用一个密封类来做为其它类的基类,会出现编译错误。正因为如此,抽象类不能申明为密封类,因为抽象类总是希望被继承的。在C#中,字符串(cs#System.String
)是一个密封类,所以没有类能继承字符串(cs#System.String
)。
举个编译错误的例子:
// 抽象类不能申明为密封类
sealed abstract class ErrorClass {
}
sealed class SealedClass {
public int Value {get; set;}
}
// 不能继承密封类
class SubClass : SealedClass {
}
密封方法
密封方法是指覆盖父类的方法后,又不希望子类覆盖此方法时,可以用密封方法。在C#中,类的方法如果不申明为抽象方法(cs#abstract
)或者虚方法(cs#virtual
),是不可以被覆盖的。所以必须满足下面两点才能申明为密封方法。
- 该方法覆盖了父类(是父类,不包括接口)方法。
- 该方法不希望被子类覆盖。
所以说,密封方法里的cs#sealed
关键字总是和cs#override
关键字同时使用的。
举个例子:
// *****错误1*****
public class Class1
{
// 没有覆盖父类方法,编译出错
public sealed int Test1()
{
return 0;
}
}
// *****错误2*****
public interface ITest2
{
int Test2();
}
public class Class2 : ITest2
{
// 没有覆盖父类方法,只是覆盖了接口方法,编译出错
public sealed int Test2();
}
// *****正确*****
public abstract class AbsClass3
{
public abstract int Test3();
}
public abstract class Class3 : AbsClass3
{
// 覆盖了父类方法,OK
public sealed override int Test3()
{
return 0;
}
}