C#中的方法覆盖

时间:2011-06-15 19:38:35

标签: c# .net inheritance override virtual

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

所以我有这个

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成员实例化时,OnPrev上的OnNextMetalGUI被调用而不是覆盖方法。这是为什么?

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

这是你如何覆盖它们(并允许更多的类覆盖这个实现):

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