Возможно ли переопределить скрытый метод? - PullRequest
3 голосов
/ 04 декабря 2009

Скажите, у меня есть следующая иерархия:

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?

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

Ответы [ 4 ]

7 голосов
/ 04 декабря 2009

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

1 голос
/ 03 июля 2011

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

public new virtual void Method()
0 голосов
/ 04 декабря 2009

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

0 голосов
/ 04 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...