【问题标题】:Method overriding in C#C#中的方法覆盖
【发布时间】:2011-09-15 20:04:35
【问题描述】:

这是一个相当简单的问题,我有一个实现通用 GUI 元素的基类,以及一系列我想要覆盖给定方法的子类,因此它们可以在通用控件上实现自己的行为(即, Prev 和 Next 按钮)。

所以我有这个

public class MetalGUI : BaseGUI {
    new protected void OnGUI()
    {
        base.OnGUI();
        if(GUI.Button(prevRect, "BACK", "ButtonLeft"))
            OnPrev();

        if(GUI.Button(nextRect, "NEXT", "ButtonRight"))
            OnNext();

    }

    virtual protected void OnPrev(){}
    virtual protected void OnNext(){}
}

这是子类之一

public class MissionSelectGUI : MetalGUI {
    new void OnGUI()
    {
        base.OnGUI();
    }

    new protected void OnPrev()
    {
        Application.LoadLevel("mainMenu");
    }
    new protected void OnNext()
    {
        Application.LoadLevel("selectPlayer");
    }
}

(这两个类都被去掉了对这种情况不重要的东西)

问题是,当我实例化 MissionSelectGUI 的成员时,MetalGUI 上的 OnPrevOnNext 被调用,而不是被覆盖的方法。这是为什么呢?

【问题讨论】:

    标签: c# .net inheritance overriding virtual


    【解决方案1】:

    我认为您应该使用 overrides 关键字而不是新关键字。见http://msdn.microsoft.com/en-us/library/51y09td4(v=vs.71).aspx#vclrfnew_newmodifier

    【讨论】:

      【解决方案2】:

      因为new 隐藏(或隐藏)该方法(它创建了一个具有相同名称的 方法)。要覆盖它(从而在类的 vtable 中添加一个条目),请使用 override。例如:

      override protected void OnPrev()
      {
          Application.LoadLevel("mainMenu");
      }
      

      【讨论】:

      • @Lacrymology 好吧,当然,它有点冗长,但它可以让您更好地控制代码的行为。
      • 补充一点艾蒂安所说的:“新”方法只有在您将对象引用为派生类时才会被调用。如果您将派生类引用为基类,它将调用基方法。在我从未遇到过的一些理论案例中,这可能非常有用。
      • @Mannimarco 当编译器抱怨我声明一个与父类中的方法具有相同签名的方法时,我主要使用new 使编译器静音。
      【解决方案3】:

      您没有覆盖这些方法,只是使用new 隐藏了它们。

      这是您将如何覆盖它们(并允许更多类覆盖此实现):

      override protected void OnPrev()
      {
          Application.LoadLevel("mainMenu");
      }
      

      【讨论】:

        【解决方案4】:

        您在 OnPrev/OnNext 方法的派生类中使用 new 关键字 - 您要做的是“覆盖”基类方法,例如使用 override 关键字。

        【讨论】:

          猜你喜欢
          • 2010-11-16
          • 2016-10-29
          • 1970-01-01
          • 1970-01-01
          • 2012-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多