Ponieważ wielokrotne dziedziczenie jest złe (komplikuje to źródło), C # nie zapewnia takiego wzorca bezpośrednio. Ale czasami pomocne byłoby posiadanie tej umiejętności.
Na przykład jestem w stanie zaimplementować brakujący wzorzec wielokrotnego dziedziczenia za pomocą interfejsów i trzech takich klas:
public interface IFirst { void FirstMethod(); }
public interface ISecond { void SecondMethod(); }
public class First:IFirst
{
public void FirstMethod() { Console.WriteLine("First"); }
}
public class Second:ISecond
{
public void SecondMethod() { Console.WriteLine("Second"); }
}
public class FirstAndSecond: IFirst, ISecond
{
First first = new First();
Second second = new Second();
public void FirstMethod() { first.FirstMethod(); }
public void SecondMethod() { second.SecondMethod(); }
}
Za każdym razem, gdy dodam metodę do jednego z interfejsów, muszę również zmienić klasę FirstAndSecond .
Czy istnieje sposób na wstrzyknięcie wielu istniejących klas do jednej nowej klasy, tak jak jest to możliwe w C ++?
Może istnieje rozwiązanie wykorzystujące generowanie kodu?
Lub może to wyglądać tak (wyobrażona składnia c #):
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
Aby nie było potrzeby aktualizowania klasy FirstAndSecond podczas modyfikowania jednego z interfejsów.
EDYTOWAĆ
Może lepiej rozważyć praktyczny przykład:
Masz istniejącą klasę (np. Tekstowy klient TCP oparty na ITextTcpClient), którego już używasz w różnych lokalizacjach w projekcie. Teraz czujesz potrzebę stworzenia komponentu swojej klasy, aby był łatwo dostępny dla programistów formularzy Windows.
O ile wiem, obecnie masz na to dwa sposoby:
Napisz nową klasę, która jest dziedziczona ze składników i implementuje interfejs klasy TextTcpClient, używając instancji samej klasy, jak pokazano za pomocą FirstAndSecond.
Napisz nową klasę, która dziedziczy z TextTcpClient i jakoś implementuje IComponent (jeszcze tego nie próbowałem).
W obu przypadkach musisz wykonać pracę według metody, a nie według klasy. Ponieważ wiesz, że będziemy potrzebować wszystkich metod TextTcpClient i Component, najłatwiejszym rozwiązaniem byłoby połączenie tych dwóch metod w jedną klasę.
Aby uniknąć konfliktów, można to zrobić przez wygenerowanie kodu, w którym wynik może być później zmieniony, ale ręczne wpisanie tego jest czystym bólem w dupie.