C# 继承与封存

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

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

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

根据我所读的内容(不记得书的名字,尽管它是从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
,以限制可继承类的含义。文档、扩展点、可修改类的设计……你是在问“为什么会有人封一个类?”还是“封一个类做什么?”第一个完全是自以为是的,第二个完全可以回答。