Страницы

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

понедельник, 6 января 2020 г.

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

#c_sharp


Чисто вопрос интереса ради. Возможно ли вызвать метод старее чем предок из потомка?
Чтонибудь типа  

(КлассПраПраДедушка)base.МетодКласса()


или

base.base.МетодКласса()

    


Ответы

Ответ 1



Конечно. Например, так: КлассПраПраДедушка 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() позаимствована отсюда.

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

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