c# - 基类上的空方法与显式类型检查

标签 c# oop inheritance

假设您有两种类型的对象,一种派生自另一种,但添加了一个额外的功能。我能想到的两种处理这个额外功能的方法是在基类上添加一个总是被调用的空方法(派生类然后可以覆盖这个方法)或显式类型检查以查看您是否有派生类的实例然后调用额外的方法。

这两个看起来都很hack,有没有更好的方法?如果不是,一个比另一个更受欢迎?这两种方法都可行,但似乎都不是特别干净,一种方法是用无用的方法 stub 污染基类,另一种方法是使用显式类型检查,这通常被认为是一个坏主意。

这里有一个例子可以清楚地说明我的意思:

public class Weapon
{
    // Should there be an empty StartCharging() here?

    public virtual void Fire()
    {
        // Do something
    }
}

public class ChargedWeapon : Weapon
{
    public void StartCharging()
    {
        // Do something
    }

    public override void Fire()
    {
        // Do something
        base.Fire();
    }
}

public class Game
{
    private Weapon weapon;

    public void HandleUserInput()
    {
        if (MouseButton.WasPressed())
        {
            // Or should there be an if (weapon is ChargedWeapon) here
            weapon.StartCharging();
        }
        else if (MouseButton.WasReleased())
        {
            weapon.Fire();
        }
    }
}

最佳答案

最好将方法添加到基类而不是进行类型检查。如果您进行类型检查然后决定实现一种也需要充电的新型武器,会发生什么情况?你会添加另一个测试条件吗?

编辑:在您的代码中,我看到开始执行 Strategy Pattern .我想您的用例将从它和 State Pattern 中受益匪浅.如果您需要有关这些的更多详细信息,请发表评论(因为从最初问题的角度来看它们有点离题)

关于c# - 基类上的空方法与显式类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6759420/

相关文章:

c# - ASP.NET 核心身份种子只创建最后一个用户

python - 查看python中所有继承的类

java - 在final方法中获取 "child"对象的Class?

c# - 为 WPF 开发人员推荐的 Web 技术?

c# - 我的消息会被两次添加到队列中吗?

javascript - 如何在 javascript 类中创建静态字段

c++ - 在 C++11 中对派生类使用基类运算符

c# - 为什么在 C# 中不继承构造函数?

c# - 如何在 WCF 中使用自定义绑定(bind)并使用用户名客户端凭据保持消息安全模式?

java - 部分枚举建模