Чисто вопрос интереса ради. Возможно ли вызвать метод старее чем предок из потомка? Чтонибудь типа
(КлассПраПраДедушка)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()
позаимствована отсюда.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый деньНаписал приложение-1 на C#, которое создает папку
Не могу справится с, на первый взгляд,простой задачей: В строке найти количество вхождений каждой буквыСоздал класс с двумя свойствами
Выдаёт ошибку: SQL logic error near "insert": syntax error" Вот код: