Оскільки багаторазове успадкування є поганим (це ускладнює джерело), 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, було б найпростішим рішенням просто об'єднати ці два в один клас.
Щоб уникнути конфліктів, це може бути зроблено за допомогою генерації коду, де результат можна буде потім змінити, але введення цього вручну - це чистий біль у дупі.