继承与密封

Inheritance and sealed

如果 class 是继承列表中的最后一个,我是否应该始终将其指定为密封的?例如,假设我有 3 个 classes,FoundationBuildingHouse.

public class Foundation
{
    // Base class
}

public class Building : Foundation
{
    // Derived from Foundation
}

public sealed class House : Building
{
    // Last in the inheritance tree
}

当我说我不想让任何人继承House而House本身继承自Building时,这是关于安全的吗?

据我所见(不记得书名了,虽然是2010年的),除非class被设计为继承,否则应该标记为密封以防止其他开发人员继承它然后 运行 陷入障碍,因为有些方法不是虚拟的。

Should I always specify a class as sealed if it's the last in the inheritance list?

这个问题没有具体的答案。可能会有一些场景,就像你提到的那样。您不希望任何人继承 House class。对于这种特殊情况,您应该密封 House class。要继续了解更多知识,您可以关注 this

在开发软件时,可能还会有其他一些情况。您是坚持使用当前的功能,还是可以在此期间进行更改。那么你应该有不同的想法。进一步学习可以关注this

假设您有一个 MyDivisor class 和 SetDivisorGetDivisor 方法。 SetDivisor方法实现如下:

public void SetDivisor(int divisor)
{
    if (divisor != 0)
    {
        _divisor = divisor; // `_divisor` is a field of the class
    }
}

即使您可能认为除数不可能为零,但有人可能会继承您的 MyDivisor class 并使用 new 关键字隐藏您的方法(即不是虚拟的)。派生的 MyEvilDivisor class 具有以下 SetDivisor 的实现:

new public void SetDivisor(int divisor)
{
    _divisor = divisor;
}

现在有人可以写了:

var divisor = new MyEvilDivisor();
divisor.SetDivisor(0);
int i = 5/(divisor.GetDivisor());

如果密封了 class,将无法继承它并更改 SetDivisor 的行为,这不会导致应用程序中肯定会发生意外的运行时错误使用 MyEvilDivisor。我想这是一个考虑安全的例子。