派生的 class 能否破坏基础 class 的实现

can a derived class corrupt base class's implementation

我是 c# 的新手,正在研究密封 class,当我遇到 这个

'密封的 class 主要用于安全原因,通过防止 意外推导,派生 class 可能会破坏基础 class'

中提供的实现

这真的可能吗?派生的 class 真的会破坏基础 class 的实现吗?如果可以,请有人举例说明。

由于多态性,您可能会破坏基础 class 实现。

如果 class A 有一个可以覆盖的 virtual 方法(即 多态 )和一个 class B 覆盖了整个方法,并且 B 不会输出与 A 的实现相同的东西,那么,似乎 B 已经改变了 [= 的实际行为11=]的实施。

sealed in class level (f.e. override sealed) 是为了在整个class.[=上同时避免继承和多态21=]

您还可以防止某些成员的多态性(仍然可以继承)在派生 class 中覆盖它们并使用 sealed 修饰符标记它们:

public class A
{
    public virtual void DoStuff() {}
}

public class B
{
    public override sealed void DoStuff() {}
}

说你需要一些看门人:

public interface IGateKeeper
{
    /// <summary>
    /// Check if the given id is allowed to enter.
    /// </summary>
    /// <param name="id">id to check.</param>
    /// <param name="age">age to check</param>
    /// <returns>A value indicating whether the id is allowed to enter.</returns>
    bool CanEnter(string id, int age);

    ... other deep needs ...
}

您可能有一个可靠的实施来测试酒吧入口处的大多数:

public class MajorityGateKeeper : IGateKeeper
{
    public virtual bool CanEnter(string id, int age)
    {
        return age >= 18;
    }

    ... other deep implementation ...
}

还有贵宾室的实现:

public class VipGateKeeper : MajorityGateKeeper
{
    public override bool CanEnter(string id, int age)
    {
        // Do the majotity test and check if the id is VIP.
        return base.CanEnter(id, age) && (id == "Chuck Norris");
    }
}

并在一秒钟内打破它:

public class DrunkGateKeeper : VipGateKeeper 
{
    public override bool CanEnter(string id, int age)
    {
        return true;
    }
}

DrunkGateKeeper 是一个 VipGateKeeper,因此您可以隐藏它喝醉了(转换为 VipGateKeeper)。但它做得很糟糕。

var gk = (VipGateKeeper) new DrunkGateKeeper();
var canEnter = gk.CanEnter("Miley Cyrus", 16);     // true (sic)

如果您将 VipGateKeeper 密封,您确定它不能被喝醉:VipGateKeeper 类型的对象 VipGateKeeper 仅此而已。

假设您在 class 中定义并实现了一个方法,在您的程序中您只需要这个实现。例如,您 return 向用户发送一条消息,每当您调用此方法时,您希望该特定消息被 return 编辑,考虑您有一个子 class 覆盖该方法并显示另一条消息,当您调用该方法时,您会得到另一个意想不到的结果,如果您将 class 标记为密封的,则可以防止意外继承。 密封是抽象设计硬币的正面。当您定义一个抽象 class 时,您允许 classes 从它派生并实现他们自己的方法实现,但 sealed class 根本不允许其他人派生它。