Переопределение метода в C # - PullRequest
1 голос
/ 15 июня 2011

Это довольно простой вопрос, у меня есть базовый класс, который реализует общие элементы 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 вызывают вместо переопределенных методов. Почему это?

Ответы [ 4 ]

9 голосов
/ 15 июня 2011

Поскольку new скрывает (или скрывает) метод (он создает новый метод с тем же именем).Чтобы переопределить это (таким образом добавляя запись в класс 'vtable), используйте override.Например:

override protected void OnPrev()
{
    Application.LoadLevel("mainMenu");
}
2 голосов
/ 15 июня 2011

Вы используете ключевое слово new в своем производном классе в своих методах OnPrev / OnNext - вам нужно «переопределить» методы базового класса, например, использовать ключевое слово override.

2 голосов
/ 15 июня 2011

Я думаю, вы должны использовать ключевое слово переопределения, а не новое.см http://msdn.microsoft.com/en-us/library/51y09td4(v=vs.71).aspx#vclrfnew_newmodifier.

1 голос
/ 15 июня 2011

Вы не переопределили методы, просто скрыли их, используя new.

Вот как вы можете переопределить их (и позволить другим классам переопределить эту реализацию):

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