ashishnagvanshi Ответов: 2

Как работает множественное наследование с использованием интерфейсов-это чистый способ множественного наследования


Мы много раз слышали, что множественное наследование в точечной сети поддерживается интерфейсами. Я искал несколько примеров того же самого. Чтобы добиться этого, я обнаружил, что создан своего рода класс Helper, реализующий 2 интерфейса. А членам интерфейса мы предоставляем тело во вспомогательном классе. Мы создаем объект из двух классов во вспомогательном классе и передаем object.method () в тело метода интерфейсных методов. Затем мы создаем объект вспомогательного класса в реализации класса, и из него мы получаем доступ к методам двух других классов. Мой вопрос: когда мы создаем объект вспомогательного класса и этот объект вспомогательного класса во внутреннем создании объекта 2 классов, почему бы нам не создать объект 2 классов в реализующем классе.

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

I am what is the benefit of (A) when we can directly create object of 2 classes in third implementing class


--Section (A)---
<pre>namespace Learning
{
    interface IA
    {
         void MethodA();
    }
    interface IB
    {
         void MethodB();
    }
    class A : IA
    {
     public void MethodA()
        {
            Console.WriteLine("Hi This is method A");
        }
    }

    class B: IB
            {
     public  void MethodB()
        {
            Console.WriteLine("Hi This is method B");
        }
    }

   class HelperClass : IA, IB
    {
        A a = new A();
        B b = new B();

        public void MethodA()
        {
            a.MethodA();
        }
        public void MethodB()
        {
            b.MethodB();
 
        }

    }
    
    class Program
    {
        static void Main(string[] args)
        {

            HelperClass hc = new HelperClass();
            hc.MethodA();
            hc.MethodB();

            //Why Not below code
            //Why this is not the way to achieve multiple inheritance
            A a = new A();
            B b = new B();
            a.MethodA();
            b.MethodB();

         }
    }  
 
}

2 Ответов

Рейтинг:
0

F-ES Sitecore

В вашем примере один интерфейс реализует MethodA, а другой MethodB. Теперь представьте, что оба интерфейса имеют MethodA, как бы ваш HelperClass реализовал MethodA? Бы его вернуть.Что и methoda или б.Что и methoda? Как оно могло решить? В этом суть того, почему вы не можете иметь множественное наследование.

"Мы много раз слышали, что множественное наследование в dot net поддерживается интерфейсами."

Во-первых, вы не наследуете интерфейсы, вы их реализуете, а во-вторых, .net позволяет реализовать несколько интерфейсов;

class MyClass : IMyIntefaceA, IMyInterfaceB


Это не просто педантизм, дело в том, что интерфейс не имеет никакой реализации (то есть никакого кода). Когда вы имеете дело с наследованием, вы имеете дело с классами, которые действительно имеют реализацию. Итак, представьте себе класс, который реализует два interfaces...it это один класс, реализующий два интерфейса, поэтому вам нужно поместить код для обоих интерфейсов в один класс. Если эти два интерфейса реализуют один и тот же метод, то это не проблема, потому что ваш единственный класс будет реализовывать этот метод только один раз, поэтому оба метода интерфейса будут иметь один и тот же конкретный метод, реализующий их.

Теперь представьте себе класс, который наследует два других класса...оба этих класса имеют свою собственную реализацию (то есть код). Теперь давайте рассмотрим, что оба этих класса реализуют один и тот же метод, поэтому, когда этот метод вызывается в производном классе, какой из унаследованных классов вызывается? Как решает фреймворк?

Вы можете возразить, что можете переопределить метод в производном классе и принять решение там, что прекрасно, но что, если методы являются виртуальными методами, а метод вызывается в базовом классе? Теперь именно фреймворк должен решить, какой метод классов вызывается и как он может это решить? Именно по этим причинам MS решила сохранить простоту и не поддерживать множественное наследование.


Рейтинг:
0

D-Matrix's Systemware

Since multiple inheritance is bad (it makes the source more complicated) C# does not provide such a pattern directly. But sometimes it would be helpful to have this ability.

C# и .NET CLR не реализовали MI, потому что они не пришли к выводу, как он будет взаимодействовать между C#, VB.net и другие языки еще не потому, что "это сделало бы исходный код более сложным"

Ми-это полезная концепция, вопросы, на которые нет ответов, такие как: "что вы делаете, когда у вас есть несколько общих базовых классов в разных суперклассах?

Perl-это единственный язык, с которым я когда-либо работал, где MI работает и работает хорошо. .Net вполне может представить его когда-нибудь, но пока нет, CLR уже поддерживает MI, но, как я уже сказал, для него пока нет языковых конструкций.

До тех пор вы застряли с прокси-объектами и несколькими интерфейсами вместо этого