这是一个相当简单的问题,我有一个实现公共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
上的OnNext
和MetalGUI
被调用而不是覆盖方法。这是为什么?
答案 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");
}