继承和密封

时间:2016-08-20 18:36:15

标签: c# inheritance sealed

如果一个类是继承列表中的最后一个,我是否应始终将其指定为密封?举个例子,假设我有3个课程,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吗?

3 个答案:

答案 0 :(得分:2)

从我读过的内容(不记得这本书的名称,虽然它是从2010年开始),除非将类设计为继承,否则应将其标记为密封,以防止其他开发人员继承它并且然后遇到障碍,因为有些方法不是虚拟的。

答案 1 :(得分:0)

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

这个问题没有具体的答案。可能会有一些情况,比如你提到的情况。你不希望任何人继承House班。对于这种特殊情况,您应该将House类密封。要继续学习更多知识,您可以关注this

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

答案 2 :(得分:0)

假设您使用MyDivisorSetDivisor方法的GetDivisor课程。 SetDivisor方法实现如下:

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

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

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

现在有人可以写:

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

如果你密封你的类,就没有办法继承它并改变SetDivisor的行为,这不会导致在使用MyEvilDivisor时肯定会发生的应用程序中的意外运行时错误。我想这是思考安全的一个例子。