Vedavyas Velaga Ответов: 3

Почему мы не можем иметь множественное наследование классов в C#?


Множественное наследование с использованием интерфейсов, как указано ниже, возможно для достижения как свойств классов A, так и B класса AB.

interface IA
  { void Print(); }
  interface IB
  { void Print(); }

  class A : IA
  {
      public void Print()
      { Console.WriteLine("ClassA"); }
  }

  class B : IB
  {
      public void Print()
      { Console.WriteLine("ClassB"); }
  }

  class AB : IA, IB
  {
      void IA.Print()
      {
          A a = new A();
          a.Print();
      }

      void IB.Print()
      {
          B b = new B();
          b.Print();
      }
  }

  class Test
  {
      public void test()
      {
          AB ab = new AB();
          ((IA)ab).Print();
          ((IB)ab).Print();
      }
  }



Тогда почему бы нам не иметь множественного наследования классов, как указано ниже.

class A
{
    public void Print()
    { Console.WriteLine("ClassA"); }
}

class B
{
    public void Print()
    { Console.WriteLine("ClassB"); }
}

class AB : A, B
{

}

class Test
{
    public void test()
    {
        AB ab = new AB();
        ((A)ab).Print();
        ((B)ab).Print();
    }
}



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

Тогда его можно преодолеть, имея код примерно такой, как указано выше.

Я знаю об алмазной проблеме, которая также может быть решена аналогичным вышеописанным способом.


я что-то упускаю, чтобы понять здесь?
Или это просто так, как C# не реализует такого рода функциональность без какой-либо причины?

Что я уже пробовал:

Я пытался понять это, читая доступные статьи в интернете

3 Ответов

Рейтинг:
2

OriginalGriff

Во-первых, интерфейсы не обеспечивают множественного наследования: интерфейсы-это не классы, это контракт, и вы не можете "наследовать" от интерфейса.

Что касается того, почему C# не поддерживает MI, то наиболее вероятные причины заключаются в том, что "преимущества не перевешивают сложности, связанные с его реализацией" - и главная причина этой сложности-проблема Алмаза: Множественное наследование - Википедия[^]

Алмазная проблема возникает, когда два класса B и C наследуют от A, а другой класс D также наследует от обоих B и C. Если метод В D вызывает метод, определенный В A, А B и C переопределили этот метод, то какой метод класса должен быть выполнен? версия из B или Версия из C?

Хотя это можно обойти (C++ делает это), это усложняет язык и код, который вы пишете, а C# предназначен для поощрения чистого, простого и поддерживаемого кода (обвинение, которое не часто возлагается на код C++!).


Рейтинг:
2

Wendelius

К сожалению, C# не поддерживает множественное наследование. Вы можете прочитать больше от Почему C# не поддерживает множественное наследование? | C# Часто Задаваемые Вопросы[^]

Однако в зависимости от ситуации существуют способы преодоления этого ограничения. Например, во многих случаях расширение класса с помощью метода расширения делает трюк. Взгляните на это Методы Расширения (Руководство По Программированию На C#) | Microsoft Docs[^]


Рейтинг:
1

CPallini

Потому что это это игрушечный язык не поддерживает его.


Wendelius

Предвзяты ли мы? :)

CPallini

Кто, я? :-)