C# 继承与封存
如果某个类是继承列表中的最后一个,我是否应该始终将其指定为密封类?例如,假设我有3门课,C# 继承与封存,c#,inheritance,sealed,C#,Inheritance,Sealed,如果某个类是继承列表中的最后一个,我是否应该始终将其指定为密封类?例如,假设我有3门课,Foundation,Building,和House public class Foundation { // Base class } public class Building : Foundation { // Derived from Foundation } public sealed class House : Building { // Last in the inh
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
}
当我说我不想让任何人继承房屋,而房屋本身继承自
建筑时,这是关于安全的吗?根据我所读的内容(不记得书的名字,尽管它是从2010年开始的),除非类被设计为继承自,它应该被标记为sealed,以防止其他开发人员继承它,然后遇到障碍,因为有些方法不是虚拟的。根据我所读的内容(不记得书的名称,尽管它是从2010年开始的),除非类被设计为从,它应该标记为sealed,以防止其他开发人员继承它,然后遇到障碍,因为有些方法不是虚拟的。如果它是继承列表中的最后一个类,我是否应该始终将其指定为sealed?
这个问题没有具体的答案。可能会有一些场景,如您所提到的。您不希望任何人从House
类继承。对于这个特定场景,您应该将House
类密封起来。继续学习更多的知识,你可以跟随
在开发软件时,可能还有其他一些情况。您是坚持使用当前功能,还是可以在这段时间内进行更改。那你应该换一种想法。为了进一步了解,您可以按照进行操作。如果类是继承列表中的最后一个,我是否应该始终将其指定为密封类?
这个问题没有具体的答案。可能会有一些场景,如您所提到的。您不希望任何人从House
类继承。对于这个特定场景,您应该将House
类密封起来。继续学习更多的知识,你可以跟随
在开发软件时,可能还有其他一些情况。您是坚持使用当前功能,还是可以在这段时间内进行更改。那你应该换一种想法。对于进一步的学习,您可以遵循假设您有一个MyDivisor
类,其中包含SetDivisor
和GetDivisor
方法。SetDivisor
方法的实现如下:
public void SetDivisor(int divisor)
{
if (divisor != 0)
{
_divisor = divisor; // `_divisor` is a field of the class
}
}
尽管您可能认为除数不可能为零,但有人可能会继承您的mydivisior
类,并使用new
关键字隐藏您的方法(这不是虚拟的)。派生的myevilldivisor
类具有以下SetDivisor
的实现:
new public void SetDivisor(int divisor)
{
_divisor = divisor;
}
现在有人可以写:
var divisor = new MyEvilDivisor();
divisor.SetDivisor(0);
int i = 5/(divisor.GetDivisor());
如果密封类,将无法继承它并更改SetDivisor
的行为,这将不会导致应用程序中出现意外的运行时错误,而在使用myevillDivisor
时肯定会发生这种错误。我想这是一个考虑安全的例子 假设您有一个带有SetDivisor
和GetDivisor
方法的MyDivisor
类。SetDivisor
方法的实现如下:
public void SetDivisor(int divisor)
{
if (divisor != 0)
{
_divisor = divisor; // `_divisor` is a field of the class
}
}
尽管您可能认为除数不可能为零,但有人可能会继承您的mydivisior
类,并使用new
关键字隐藏您的方法(这不是虚拟的)。派生的myevilldivisor
类具有以下SetDivisor
的实现:
new public void SetDivisor(int divisor)
{
_divisor = divisor;
}
现在有人可以写:
var divisor = new MyEvilDivisor();
divisor.SetDivisor(0);
int i = 5/(divisor.GetDivisor());
如果密封类,将无法继承它并更改SetDivisor
的行为,这将不会导致应用程序中出现意外的运行时错误,而在使用myevillDivisor
时肯定会发生这种错误。我想这是一个考虑安全的例子 是的,如果您希望您的消费者不继承,您可以将其标记为sealed
,以限制可继承类的含义。文档、扩展点、可修改类的设计……你是在问“为什么会有人封一个类?”还是“封一个类做什么?”第一个完全是自以为是的,第二个完全可以回答。是的,如果希望使用者不继承,可以将其标记为sealed
,以限制可继承类的含义。文档、扩展点、可修改类的设计……你是在问“为什么会有人封一个类?”还是“封一个类做什么?”第一个完全是自以为是的,第二个完全可以回答。