【问题标题】:Making virtual base class members static in derived classes在派生类中使虚拟基类成员静态
【发布时间】:2023-03-23 11:26:01
【问题描述】:

我正在用 MonoGame 编写游戏,并且有一个 entity 类,几乎每个游戏对象都使用它。虽然实体类没有自己定义的纹理,但在该类中声明 texture 成员将大大简化代码,无需在每个子类中使用完全相同的代码覆盖某些虚函数。

例如,我目前必须把它放在我的Entity 类中:

public virtual void Draw() { }

然后将其添加到每个派生类中:

public static Texture2D texture;
...
public override void Draw()
        {
            if (active)
                Game1._spriteBatch.Draw(texture, position, Color.White);
        }

我尝试了各种方法,例如new static,但都没有奏效。有人可以帮忙,还是在 C# 中根本不可能?我知道我可以编写一个虚拟访问器函数并覆盖它,但我宁愿不必在每个子类中都编写它。

【问题讨论】:

  • 有什么理由在基类中有纹理,由派生类构造函数提供给基类​​构造函数? (不清楚你想用new static做什么,但静态方法基本上不参与继承。)
  • 我不想在基类中设置纹理,因为每种对象类型(玩家、敌人等)都使用不同的类型,并且我想让每个类都保持静态以保存记忆。
  • 每个基类对象中只有一个额外的变量 - 而不是每个基类对象的不同对象。您是否有任何证据表明一个额外的变量会给您带来重大问题?如果您真的不想要任何状态,那么实例之间的区别 必须通过继承,因此您 必须覆盖每个类中的方法或属性。你可以使用Texture 属性来做到这一点,它比Draw 方法更简单,但你仍然需要在每个类中添加一些代码。

标签: c# class oop inheritance virtual-functions


【解决方案1】:

this question 很好地介绍了这一点,所以我会检查一下。 简而言之,您可以使用new static,只是不要将基类的方法标记为virtual。您还需要记住 slightly different behaviornew 和标准方法覆盖。

话虽如此,如果您出于记忆原因这样做,您目前是否遇到问题?如果你不是,我会选择更清洁和更易于维护的设计,然后担心出现问题时的优化。

【讨论】:

    【解决方案2】:

    在派生类中使虚拟基类成员静态

    不可能,句号。成员名称是唯一的,您不能根据 C# 规范将成员名称重新定义为静态的。您可以创建另一个静态成员,并使用原始成员的最终覆盖来访问这个成员,但这会将这个成员留在原处。

    C# 根本不支持这样的重新定义。

    我可以编写一个虚拟访问器函数并覆盖它,但我宁愿不必 把它写在每个子类中。

    然后做一个新的静态的和一个基本上使用静态的最终覆盖。完成。

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2013-12-05
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2016-05-21
      相关资源
      最近更新 更多