谈谈C#中的sealed关键字

sealed关键字在C#中主要用于以下两个方面:
  • 在类声明中使用sealed可指定该类为密封类,防止其它类继承此类。
  • 在方法声明中使用sealed可指定该方法为密封方法,防止子类覆盖此方法。
下面来分别介绍一下密封类和密封方法。

密封类

密封类无法被其它类继承,如果试图用一个密封类来做为其它类的基类,会出现编译错误。正因为如此,抽象类不能申明为密封类,因为抽象类总是希望被继承的。在C#中,字符串(System.String)是一个密封类,所以没有类能继承字符串(System.String)。 举个编译错误的例子:
// 抽象类不能申明为密封类
sealed abstract class ErrorClass {
}
sealed class SealedClass {
    public int Value {get; set;}
}
// 不能继承密封类
class SubClass : SealedClass {
}

密封方法

密封方法是指覆盖父类的方法后,又不希望子类覆盖此方法时,可以用密封方法。在C#中,类的方法如果不申明为抽象方法(cs#abstract)或者虚方法(virtual),是不可以被覆盖的。所以必须满足下面两点才能申明为密封方法。
  1. 该方法覆盖了父类(是父类,不包括接口)方法。
  2. 该方法不希望被子类覆盖。
所以说,密封方法里的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;
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注