2009-12-04 2 views
3

Скажет, у меня есть следующая иерархия:Можно ли переопределить скрытый метод?

public class MyClass 
{ 
    protected virtual void Method() { ... } 
} 

public class MySubClass : MyClass 
{ 
    public new virtual void Method() { ... } 
} 

public class MySubSubClass : MySubClass 
{ 
    // how do I reference the protected Method() to override it? 
} 

Можно ли переопределить реализацию методы protected(), так что вызовы от других методов, определенных в MyClass посланы к реализации в MySubSubClass?

Если это невозможно, было бы хорошо просветить, почему.

+0

вы пробовали это? –

+0

Вам нужны типы на ваших методах; Кроме того, я могу неправильно истолковать описание, но вы просто ищете ключевое слово override? – Matt

+0

Я пробовал 'protected override void Method()', что приводит к синтаксическим ошибкам «Невозможно изменить права доступа» и «Метод с той же сигнатурой уже объявлен». Я также попробовал интерфейс 'protected override void MyClass.Method()', который приводит к трем различным синтаксическим ошибкам. –

ответ

7

Если вы пытаетесь переопределить версию метода, определенного в MyClass затем ответ вы не можете. Определение в MySubClass скрывает эту реализацию от вас, и вам не удастся ее переопределить.

+0

Глупое наблюдение? Если он отменяет это, имеет ли это значение, с каких времен он заменяет, так как он его заменяет? – Matt

+1

@Matt: Да, несмотря на одно и то же имя, это две разные функции. Если вы вызываете '((MyClass) это) .Method()' он будет запускать другой код из 'this.Method()'. –

+0

Он может только скрывать метод в MyClass, но не переопределять его - если экземпляр MySubSubClass был перенесен в MyClass, тогда вызов Method() может быть только в MyClass, он не будет отправлен практически – thecoop

0

Да. Вы можете использовать «новое» ключевое слово для повторного ввода любого метода, который вы хотите. С этого момента каждый вызов метода «newed» будет адресован новой реализации.

В этом случае любой вызов Method() возник из MyClass будет использовать MySubSubClass реализацию до тех пор, пока объект в вопросе типа MySubSubClass

+0

Я не уверен, что буду следовать за тобой. Я понимаю, что я могу использовать 'new' для переопределения имени конкретного метода. Я сделал это в MySubClass. Но поскольку это «новый», MyClass не знает об этом и не будет * отправлять ему. –

0

Как сказал @ Джаред, вы не можете. Я могу только предположить, что вы пытаетесь избежать использования new снова, потому что вы хотите правильно обрабатывать virtual. Единственный способ справиться с этим - избавиться от public new версии Method() и назвать его чем-то другим. new полностью скрывает любую версию метода, который вы обновляете, который может существовать в объектах-предках.

+0

Благодарим вас, прочитав ответ Джареда, переименование MySubClass.Method - это тот же самый вывод, к которому я пришел. Кстати, я не пытаюсь избежать «нового». Я не знаю, как могло помочь другое использование 'new'. Я просто хочу изменить реализацию метода в супер-суперклассе, который скрыт суперклассом. –

1

если вы отмечаете свой скрытый метод, как и быть виртуальным вы можете переопределить скрытый метод:

public new virtual void Method() 
Смежные вопросы