@stepagrus

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

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 являются библиотечными и мы не можем их изменить.
  • Вопрос задан
  • 619 просмотров
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 6
  • mindtester
    @mindtester
    делаю странные вещи, обычно на C#..и за деньги
    (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
         }
      }
    Ответ написан
  • @LiptonOlolo
    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.
    Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
ZennoLab Нижний Новгород
от 40 000 руб.
от 130 000 до 150 000 руб.
23 июня 2018, в 16:32
1000 руб./за проект
23 июня 2018, в 16:23
999 руб./за проект