Множественное наследование в C# с вызовом базовых методов - PullRequest
0 голосов
/ 23 марта 2020
using System;               


public class A
{
    public  virtual string GetDataFromA()
    {
       return "This Is base Class A" ;  
    }
}

public class B
{
    public  virtual string GetDataFromB()
    {
       return "This Is base Class B" ;  
    }
}

public class C : B,A
{
     public overide string GetDataFromB()
     {
         var data = base.GetDataFromB();
         return data + "This Is child Class C";
     }

     public overide string GetDataFromA()
     {
         var data = base.GetDataFromB();
         return data + "This Is child Class C";
     }
}

public class Program
{
    public static void Main()
    {
        var myCobject = new c();
        c.GetDataFromB();
        c.GetDataFromA();
    }
}

Это простой вопрос, и я знаю, что мы не можем использовать множественное наследование в C#, поэтому мы используем интерфейс. Но моя проблема в том, как я вызываю метод базового класса, когда я использую множественное наследование, пожалуйста, дайте мне знаю, если я что-то упустил. Я хочу вызвать метод базового класса A и B в моем классе C. В то же время я хочу вызвать метод базового класса в методе дочернего класса И A, и B

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Есть риск запутаться. Простым решением этой проблемы является композиция классов, как показано ниже:

public class A
{
    public void GetData()
    {
        Console.WriteLine("Data coming from A");
    }
}
// Here we use composition over inheritance.
public class B
{
    A _a;
    public B()
    {
      _a = new A();
    }
    public virtual void GetData()
    {
        _a.GetData();
        Console.WriteLine("Data coming from B");
    }
}
public class C : B 
{
    public override void GetData()
    {
        base.GetData();
        Console.WriteLine("Data coming from C");
    }
}

Теперь, если вы используете вот так, вы можете использовать следующий код:

var c = new C();
c.GetData();

, который производит вывод:

Data coming from A
Data coming from B
Data coming from C

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

0 голосов
/ 23 марта 2020

Если вы рассматриваете идею «составление по наследованию», вы можете решить эту проблему с помощью приведенного ниже кода. Причину, по которой мы выбираем композицию, можно объяснить по этой ссылке (https://medium.com/humans-create-software/composition-over-inheritance-cb6f88070205). Есть еще несколько способов решить эту проблему, одним из которых является шаблон декоратора. Но для простоты состав достаточно хорош, чтобы справиться с работой.

public class A
{
    public  virtual string GetDataFromA()
    {
       return "This Is base Class A" ;  
    }
}

public class B
{
    public  virtual string GetDataFromB()
    {
       return "This Is base Class B" ;  
    }
}

public class C
{
     private readonly _aService = new A();
     private readonly _bService = new B();
     public overide string GetDataFromB()
     {
         var data = _bService.GetDataFromB();
         return data + "This Is child Class C";
     }

     public overide string GetDataFromA()
     {
         var data = _aService.GetDataFromB();
         return data + "This Is child Class C";
     }
}

public class Program
{
    public static void Main()
    {
        var myCobject = new c();
        c.GetDataFromB();
        c.GetDataFromA();
    }
}
...