最新消息:把Logo换了一下,虽然丑了点,但至少完全是自己的设计

谈谈C#中的sealed关键字

CSharp 宇托 254浏览 暂无评论

sealed关键字在C#中主要用于以下两个方面:

  • 在类声明中使用sealed可指定该类为密封类,防止其它类继承此类。
  • 在方法声明中使用sealed可指定该方法为密封方法,防止子类覆盖此方法。

下面来分别介绍一下密封类和密封方法。

密封类

密封类无法被其它类继承,如果试图用一个密封类来做为其它类的基类,会出现编译错误。正因为如此,抽象类不能申明为密封类,因为抽象类总是希望被继承的。在C#中,字符串(System.String)是一个密封类,所以没有类能继承字符串(System.String)。

举个编译错误的例子:

C#
// 抽象类不能申明为密封类
sealed abstract class ErrorClass {
}

sealed class SealedClass {
	public int Value {get; set;}
}

// 不能继承密封类
class SubClass : SealedClass {
}

密封方法

密封方法是指覆盖父类的方法后,又不希望子类覆盖此方法时,可以用密封方法。在C#中,类的方法如果不申明为抽象方法(abstract)或者虚方法(virtual),是不可以被覆盖的。所以必须满足下面两点才能申明为密封方法。

  1. 该方法覆盖了父类(是父类,不包括接口)方法。
  2. 该方法不希望被子类覆盖。

所以说,密封方法里的sealed关键字总是和override关键字同时使用的。

举个例子:

C#
// *****错误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;
    }
}

转载请注明:宇托的狗窝 » 谈谈C#中的sealed关键字

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址