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

203
26 ноября 2017, 11:52

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

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

или

base.base.МетодКласса()
Answer 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() позаимствована отсюда.

READ ALSO
Поиск чисел в string

Поиск чисел в string

Решаю задачу:

259
Папка создается не в нужном месте C#

Папка создается не в нужном месте C#

Добрый деньНаписал приложение-1 на C#, которое создает папку

220
Mассивы класса c шарп

Mассивы класса c шарп

Не могу справится с, на первый взгляд,простой задачей: В строке найти количество вхождений каждой буквыСоздал класс с двумя свойствами

249
Ошибка: SQL logic error near “insert”: syntax error"

Ошибка: SQL logic error near “insert”: syntax error"

Выдаёт ошибку: SQL logic error near "insert": syntax error" Вот код:

204