Поскольку множественное наследование - это плохо (оно усложняет исходный код), 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 при изменении одного из интерфейсов.
РЕДАКТИРОВАТЬ
Может быть, лучше рассмотреть практический пример:
У вас есть существующий класс (например, текстовый TCP-клиент на основе ITextTcpClient), который вы уже используете в разных местах внутри вашего проекта. Теперь вы чувствуете необходимость создать компонент вашего класса, чтобы он был легкодоступным для разработчиков форм Windows.
Насколько я знаю, в настоящее время у вас есть два способа сделать это:
Напишите новый класс, который наследуется от компонентов и реализует интерфейс класса TextTcpClient, используя экземпляр самого класса, как показано с помощью FirstAndSecond.
Напишите новый класс, который наследуется от TextTcpClient и каким-то образом реализует IComponent (на самом деле еще не пробовал).
В обоих случаях вам нужно выполнять работу для каждого метода, а не для каждого класса. Поскольку вы знаете, что нам потребуются все методы TextTcpClient и Component, самым простым решением было бы просто объединить эти два метода в один класс.
Чтобы избежать конфликтов, это можно сделать с помощью генерации кода, после чего результат может быть изменен, но вводить это вручную - чистая головная боль.