使用类成员密封的运算符

本文关键字:运算符 密封 成员 | 更新日期: 2023-09-27 18:05:59

我在Troelsen的书中发现,运算符密封可以在类的成员上使用,以保护虚拟方法不受覆盖的影响。

但是,如果我不想覆盖一个虚拟方法,那么让它成为有什么意义呢?

使用类成员密封的运算符

您可能会遇到这样的情况:

public class A
{
    public virtual void MyMethod()
    {
        //...
    }
}

public class B : A
{
    public override void MyMethod()
    {
        //...
    }
}

public class C : B
{
    public override void MyMethod()
    {
        //...
    }
}

但是,如果您希望继承类C不能覆盖BMyMethod,同时仍然允许B覆盖A的呢?然后你可以做:

public class B : A
{
    public sealed override void MyMethod()
    {
        //...
    }
}

进行此更改后,将无法再覆盖C中的方法。

在这种情况下,考虑以下示例:

public class A
{
    public virtual void SomeMethod() { }
}
public class B : A
{
    public sealed override void SomeMethod() { }
}
public class C : B
{
    public override void SomeMethod() { }
}

在本例中,如果不在class B中的SomeMethod上使用sealed关键字,class C将能够覆盖它,因为它的原始声明是virtual。此上下文中的sealed关键字会生成编译器错误。有关详细信息,请参阅MSDN。