派生类会破坏基类的实现吗

阿伦

当我遇到这个问题时,我是C#的新手,正在学习密封类

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

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

奥雷斯

假设您需要一些门卫:

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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

防止派生类被破坏

来自分类Dev

从派生类中隐藏基类的实现细节

来自分类Dev

基类实现INotifyPropertyChanged:派生类型可以使用其PropertyChanged事件吗?

来自分类Dev

基类实现INotifyPropertyChanged:派生类型可以使用其PropertyChanged事件吗?

来自分类Dev

代码会复制到派生类吗?

来自分类Dev

从派生类创建基类对象

来自分类Dev

从基类创建派生类的实例

来自分类Dev

从基类的派生类访问属性

来自分类Dev

静态实例基类/派生类

来自分类Dev

从基类方法克隆派生类

来自分类Dev

非多态派生类的基类

来自分类Dev

基类中派生类的组成

来自分类Dev

从派生类访问基类对象

来自分类Dev

派生类定义的基类集合

来自分类Dev

对派生类对象的基类引用

来自分类Dev

从基类指针访问派生类

来自分类Dev

从基类指针克隆派生类

来自分类Dev

从基类方法克隆派生类

来自分类Dev

静态实例基类/派生类

来自分类Dev

从派生类计算基类参数

来自分类Dev

基类中派生类的组成

来自分类Dev

从基类修改派生类的值

来自分类Dev

基类不实现INotifyPropertyChange;如何在派生类中实现它?

来自分类Dev

当基类实现抽象时,在派生类上指定实现接口

来自分类Dev

派生类可以在类声明中定义基类数组的大小吗?

来自分类Dev

基类和派生类不能都有同名的私有嵌套类吗?

来自分类Dev

在派生类中以不同方式实现基类枚举

来自分类Dev

在基类中声明的C#接口方法无需在派生类中再次实现

来自分类Dev

创建一个实现派生类单例的基类