多重継承は悪いので(ソースをより複雑にします)、C#はそのようなパターンを直接提供しません。しかし、この能力があると役立つ場合があります。
たとえば、インターフェイスとそのような3つのクラスを使用して、不足している多重継承パターンを実装できます。
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(); }
}
インターフェイスの1つにメソッドを追加するたびに、FirstAndSecondクラスも変更する必要があります。
C ++で可能なように、複数の既存のクラスを1つの新しいクラスに注入する方法はありますか?
たぶん、ある種のコード生成を使用した解決策はありますか?
または、次のようになります(架空のc#構文)。
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
そのため、インターフェイスの1つを変更するときにFirstAndSecondクラスを更新する必要はありません。
編集
多分それは実用的な例を考える方が良いでしょう:
プロジェクト内の別の場所で既に使用している既存のクラス(ITextTcpClientに基づくテキストベースのTCPクライアントなど)があります。これで、Windowsフォーム開発者が簡単にアクセスできるようにクラスのコンポーネントを作成する必要性を感じました。
私が知る限り、現在これを行うには2つの方法があります。
コンポーネントから継承され、FirstAndSecondで示されているように、クラス自体のインスタンスを使用してTextTcpClientクラスのインターフェースを実装する新しいクラスを記述します。
TextTcpClientから継承し、どういうわけかIComponentを実装する新しいクラスを記述します(実際にはまだこれを試していません)。
どちらの場合も、クラスごとではなくメソッドごとに作業を行う必要があります。TextTcpClientとComponentのすべてのメソッドが必要であることを知っているので、これら2つを1つのクラスに結合するのが最も簡単なソリューションです。
衝突を回避するために、後で結果が変更される可能性があるコード生成によってこれを行うことができますが、これを手で入力することは、お尻の純粋な痛みです。