继承与密封
Inheritance and sealed
如果 class 是继承列表中的最后一个,我是否应该始终将其指定为密封的?例如,假设我有 3 个 classes,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
时,这是关于安全的吗?
据我所见(不记得书名了,虽然是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 和 SetDivisor
和 GetDivisor
方法。 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
。我想这是一个考虑安全的例子。
如果 class 是继承列表中的最后一个,我是否应该始终将其指定为密封的?例如,假设我有 3 个 classes,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
时,这是关于安全的吗?
据我所见(不记得书名了,虽然是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 和 SetDivisor
和 GetDivisor
方法。 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
。我想这是一个考虑安全的例子。