1. ホーム
  2. c#

[解決済み】C#の多重継承について

2022-04-20 12:56:47

質問

多重継承は良くない(ソースが複雑になる)ので、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クラスを更新する必要がないようにするためです。


EDIT

実例で考えたほうがいいかもしれませんね。

既存のクラス(例:ITextTcpClientをベースにしたテキストベースのTCPクライアント)があり、プロジェクト内のさまざまな場所ですでに使用しています。 今、あなたは、Windowsフォームの開発者が簡単にアクセスできるように、そのクラスのコンポーネントを作成する必要性を感じています。

私の知る限り、現在これを行うには2つの方法があります。

  1. FirstAndSecondで示したように、TextTcpClientクラスのインスタンスを用いて、componentsを継承した新しいクラスを作成し、そのインターフェイスを実装してください。

  2. TextTcpClientを継承し、何らかの方法でIComponentを実装した新しいクラスを書きなさい(まだ実際に試していません)。

どちらの場合も、クラス単位ではなく、メソッド単位で作業をする必要があります。TextTcpClientとComponentのすべてのメソッドが必要なことが分かっているので、この2つを1つのクラスにまとめるのが最も簡単な解決方法でしょう。

コンフリクトを避けるために、結果を後から変更できるコード生成で行うこともできますが、手書きでこれを入力するのは本当に面倒くさいです。

解決方法は?

<ブロッククオート

多重継承は良くない(ソースが複雑になる)ので、C#はこのようなパターンを直接提供しない。しかし、この機能があると便利なことがある。

C#と.net CLRがMIを実装していないのは、C#、VB.net、その他の言語間でどのように相互運用するかまだ結論が出ていないからであり、「ソースを複雑にする」ことが理由ではありません"quot。

MIは有用な概念ですが、未解決の問題は、次のようなものです。

Perlは、私がこれまでに扱った言語の中で、MIが機能し、うまく機能する唯一の言語です。CLRはすでにMIをサポートしていますが、私が言ったように、それ以上の言語構成はまだありません。

それまでは、Proxyオブジェクトと複数のInterfacesで代用することになります :(