派生类可以破坏基类的实现

时间:2015-03-19 10:13:52

标签: c# inheritance sealed

当我遇到时,我对c#很新,正在研究密封课程 此

'密封类主要是出于安全原因通过预防使用 派生类可能会破坏基类中提供的实现的意外派生'

这真的有可能吗?派生类真的可以破坏基类的实现吗?如果是这样,有人可以用一个例子来解释。

3 个答案:

答案 0 :(得分:1)

说你需要一些看门人:

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。

答案 1 :(得分:0)

由于多态,您可能会损坏基类实现。

如果类A具有可以覆盖的virtual方法(即多态),并且类B会覆盖整个方法,并且{{1我没有输出与B实现相同的内容,似乎A改变了B的实际行为实施

类级别(f.e. A)中的

sealed旨在避免整个类的继承和多态。

您也可以阻止某些成员覆盖派生类并使用override sealed修饰符标记它们的多态(继承仍然可行):

sealed

答案 2 :(得分:0)

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