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