2011-06-15 36 views
1

这是一个相当简单的问题,我有一个实现常见GUI元素的基类,以及一系列我想重写给定方法的子类,以便他们可以在普通控制(即Prev和Next按钮)。在C中覆盖的方法#

所以我有这个

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正在调用而不是重写方法。为什么是这样?

回答

9

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

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

该死的笨语言,我说 – Lacrymology 2011-06-15 19:44:02

+0

@Llammology嗯,当然,这有点冗长,但它可以让你更好地控制代码的行为。 – 2011-06-15 19:46:03

+0

要在Etienne所说的内容上添加一点:只有在将对象引用为派生类时才会调用“new”方法。如果您将派生类引用为基类,它将调用基本方法。这在我从未遇到的一些理论情况下可能是非常有用的。 – Coeffect 2011-06-15 19:57:19

1

您还没有重写方法,只是使用new隐藏它们。

这是你将如何覆盖它们(和允许进一步的类重写此实现):

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

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