Поскольку множественное наследование плохо (это делает источник более сложным), С# не предоставляет такой шаблон напрямую. Но иногда было бы полезно иметь эту способность.
Например, я могу реализовать отсутствующий шаблон множественного наследования с использованием интерфейсов и трех классов:
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(); }
}
Каждый раз, когда я добавляю метод к одному из интерфейсов, мне нужно также изменить класс FirstAndSecond.
Есть ли способ внедрить несколько существующих классов в один новый класс, как это возможно в С++?
Может быть, есть решение, использующее какое-то генерирование кода?
Или это может выглядеть так (воображаемый синтаксис С#):
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
Таким образом, при изменении одного из интерфейсов не потребуется обновлять класс FirstAndSecond.
ИЗМЕНИТЬ
Может быть, лучше рассмотреть практический пример:
У вас есть существующий класс (например, текстовый TCP-клиент на основе ITextTcpClient), который вы уже используете в разных местах внутри вашего проекта. Теперь вы чувствуете потребность создать компонент своего класса, чтобы он был легко доступен для разработчиков форм Windows.
Насколько я знаю, у вас есть два способа сделать это:
-
Напишите новый класс, который наследуется от компонентов и реализует интерфейс класса TextTcpClient, используя экземпляр самого класса, как показано в FirstAndSecond.
-
Напишите новый класс, который наследует от TextTcpClient и каким-то образом реализует IComponent (на самом деле он еще не пытался это сделать).
В обоих случаях вам нужно выполнить работу за метод, а не за класс. Поскольку вы знаете, что нам понадобятся все методы TextTcpClient и Component, это было бы самым простым решением просто объединить эти два в один класс.
Чтобы избежать конфликтов, это может быть сделано с помощью генерации кода, где результат может быть изменен впоследствии, но набирать это вручную - это чистая боль в заднице.