Задать вопрос

Как вызвать метод родителя родителя?

public class A
  {
    protected virtual void Method()
    {
      Console.Write("A");
    }
  }

  public class B : A
  {
    protected override void Method()
    {
      Console.Write("B");
    }
  }

  public class C : B
  {
    public void Some()
    {
      //как вызвать Method из класса A?
    }
  }


как вызвать Method из класса A?
Важно: классы A и B являются библиотечными и мы не можем их изменить.
  • Вопрос задан
  • 2249 просмотров
Подписаться 4 Простой Комментировать
Решения вопроса 1
@stepagrus Автор вопроса
Это невозможно сделать законным способом.

https://docs.microsoft.com/ru-ru/dotnet/csharp/lan...

Реализацию виртуального члена можно изменить путем переопределения члена в производном классе.


Класс B хранит реализацию базового класса A.
Класс C хранит реализацию своего базового класса B, а вот к реализации A мы не имеем доступа языковыми средствами C#.

Виртуальный метод класса A всё же можно вызвать из класса C, прибегнув к грязному хаку IL кода, но это не наши методы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
(this as A).Method()

((A)this).Method()

ps .. сам не пробовал ))

pps .. попробовал.. не прокатило ((

кстати - protected вообще не дает использовать Method() в Some()

ppps любопытно, что на stackoverflow полно ответов типа моего, при чем многие отмечены ответами

совет - пересмотрите архитектуру на предмет применения интерфейсов и расширений.. я последние годы чуть ли не 90% кода реализую в расширениях, крайне редко новые классы (чаще просто структуры, а сейчас все чаще кортежи.. а то и вовсе безымянные кортежи ;))), и только по необходимости интерфейсы

по поводу расширений - это вообще инструмент, позволяющий много разных элегантных решений

в частности можно реализовать одноименные расширения для всей иерархии A, B, C, и согласно различию сигнатуры входных параметров, они не будут конфликтовать. в том числе и ни каких проблем в наследованием и переопределением

вообще, с годами, убеждаюсь, что городить свою иерархию классов ооочень далеко НЕ всегда оправдано

pppps ну и раз такое дело - на всякий случай тоже подпишусь, вдруг есть современное решение ))

обещанный эскиз на основе расширений https://dotnetfiddle.net/UTPZLv
Ответ написан
@cicatrix
было бы большой ошибкой думать
Если вы можете модифицировать только метод C, то наследовать вам надо его от A. Тогда можно.

// Наследуем C от B
  public class C : B
  {
      // Пользуемся функционалом B, унаследованным от B
  }
  // Добавляем надкласс, наследующий от A
  public class D : A
  {
     public C myBfunctional { get; set; } // Через это свойство получаем функционал B
     public void Method()
     {
         base.Method(); // Пользуемся методом, унаследованным из A
     }
  }
Ответ написан
DarkRaven
@DarkRaven
разработка программного обеспечения
Рекомендую обратить внимание вот сюда - https://stackoverflow.com/a/16905179/2822609
А вообще, зачем такие сложности?
Ответ написан
@OwDafuq
public class A
    {
        protected virtual void Method()
        {
            Console.Write("A");
        }
    }

    public class B : A
    {
        protected override void Method()
        {
            Console.Write("B");
        }

        protected void MethodInA()
        {
            base.Method();
        }
    }

    public class C : B
    {
        public void Some()
        {
            MethodInA();
        }
    }


Можно так, т.к. там protected, то Method из класса A можно вызвать ТОЛЬКО в B.
Ответ написан
@ssrdop
Чтобы из класса B вызвать метод класса A попробуйте
base.method();

https://docs.microsoft.com/ru-ru/dotnet/csharp/lan...
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
Рефлексия в помощь вам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы