如果一个类是继承列表中的最后一个,我是否应始终将其指定为密封?举个例子,假设我有3个课程,Foundation
,Building
和House
。
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
吗?
答案 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)
假设您使用MyDivisor
和SetDivisor
方法的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
时肯定会发生的应用程序中的意外运行时错误。我想这是思考安全的一个例子。