Страницы

Поиск по вопросам

понедельник, 11 февраля 2019 г.

C# вызов методов предка

Чисто вопрос интереса ради. Возможно ли вызвать метод старее чем предок из потомка? Чтонибудь типа
(КлассПраПраДедушка)base.МетодКласса()
или
base.base.МетодКласса()


Ответ

Конечно.
Например, так:
КлассПраПраДедушка grandpa = this; grandpa.МетодКласса();
Ну или просто ((КлассПраПраДедушка)this).МетодКласса();
Если МетодКласса не перекрыт при помощи new, то можно, разумеется, просто МетодКласса();
Синтаксиса, подобного base, для спуска дальше вниз по иерархии, нету. То есть, вам нужно указать точный тип предка.

Как правильно подсказывает @AntonShchyrov, для случая виртуального переопределённого метода, вызвать метод метод предка дальше, чем base, средствами языка невозможно.
Можно сделать грубый хак через рефлексию:
class Grandpa { public virtual void Do() => Console.WriteLine("Grandpa.Do"); }
class Father : Grandpa { public override void Do() => Console.WriteLine("Father.Do"); }
class Child : Father { public void CallGrandpa() { ((Action)Activator.CreateInstance( typeof(Action), this, typeof(Grandpa).GetMethod("Do").MethodHandle.GetFunctionPointer())).Invoke(); } }
Никогда не делайте так. О причинах, почему плохо вызывать что попало, говорит Эрик Липперт здесь

Прямой вызов через рефлексию не работает, и вызывает в реальности переопределённый метод. Хитрость с MethodHandle.GetFunctionPointer() позаимствована отсюда

Комментариев нет:

Отправить комментарий