もっと詳しく

プログラマーは、多重継承を使用して、さまざまなクラスや階層の機能を統合するクラスを構築できます。 子クラスが複数の基本クラスコントラクトを組み合わせたい場合にも役立ちます。 多重継承はC#ではサポートされていません。プログラマーは、多重継承によって言語が過度に複雑になり、十分なメリットが得られないと考えているためです。 C#プログラミング言語では、クラスは1つの親クラスからのみ継承できます。これは単一継承と呼ばれます。

ただし、インターフェイスまたはクラスとインターフェイスの組み合わせを使用できます。インターフェイスの後には、シグニチャでクラス名が続きます。 この記事では、さまざまなアプローチを利用してC#で多重継承を実現する方法を示します。

C#インターフェイスとは

私たちが知っているように、多重継承はクラスでは実現できませんが、interfaceキーワードを使用すると、インターフェースで実現できます。 このインターフェースは、メソッド、プロパティ、イベント、およびインデクサーの定義のみを提供し、コードの実装は提供しません。 アクセス修飾子は暗黙的にパブリックで抽象的であるため、インターフェイスメンバーに追加することはできません。 変数、定数メンバー、コンストラクタ、デストラクタ、および静的メンバーはすべて、インターフェイスで許可されていません。

C#インターフェイスの重要性

インターフェイスはクラスと同じではありません。 メソッドシグネチャのみがあります。 実装がないため作成できません。 それから派生したクラスは、実装ロジックを提供します。 インターフェイスは、純粋な抽象クラスと見なされることがよくあります。 ただし、抽象クラスではなくインターフェイスを利用すると、多重継承をサポートできるという利点があります。

C#の多重継承のためのインターフェイスを実装する方法

C#言語では、多重継承機能を実現するためのさまざまなアプローチがあります。 インターフェースを使用して多重継承を実装する基本を理解するために、次の図にいくつかのプログラムがあります。

例1:複数のクラスの継承を実装する

次のクラスで多重継承を実装しようとしています。 最初に、最初の親クラスと2番目の親クラスのプロパティを子クラスに継承しようとします。 ただし、C#は複数のクラスの継承を直接サポートしていないため、コンパイラは実行時エラーをスローします。

コードの先頭にシステムライブラリを含めました。 その後、親クラス「Fruits」を作成し、クラスのメソッドを「MyFruits」として定義しました。 メソッド「MyFruits」では、「MyList」としてリストを作成し、addメソッドを使用してリストにさまざまなアイテムを追加しました。 foreachループは、リスト内の各アイテムを反復処理し、リストアイテムを新しい変数「elements」に割り当てるために使用されます。 次に、別の親クラス「FruitColors」を作成し、実装用のメソッド「colors」を提供しました。 また、前のクラスと同様に、クラス「色」のリストに項目を追加しました。

これで、「FruitDetails」という名前の子クラスができました。この子クラスは、指定された2つの親クラスを継承します。 最後に、メインメソッド「GetDetails」があり、そこにメインメソッドがあり、メインメソッドに子クラス「FruitsDetails」のオブジェクトを作成しました。 これらのオブジェクトはここで親クラスメソッドを呼び出します。これにより、コードがあいまいになります。

次の画像に示すように、コンパイル時に、上記のプログラムは「クラスが複数の基本クラスを持つことはできません」という例外をスローします。

例2:多重継承のためのインターフェースの実装

C#はクラスで多重継承を実装していませんが、Interfaceを使用してそれを実現できます。 インターフェイスは完全な抽象化を提供しますが、特定のメソッドを含めることはできません。

前のコードでは、キーワード「interface」を使用してインターフェースを構築し、インターフェースには「Interface1」という名前を付けています。 インターフェイスには「Names」メソッドのみを作成し、他には何も作成しませんでした。 次に、インターフェイスを作成するための親クラス「Student」を定義しました。 親クラスでは、メソッド「Names」の実装を提供しました。 メソッド「Names」には、「list」として表される配列のリストがあり、addメソッドを使用してランダムな名前を追加しました。 WriteLineはリスト要素を出力します。 ここでは、foreachループを使用して、新しく作成された変数「values」を使用して各リスト要素を反復処理します。

次に、2番目の親クラス用に別のインターフェイス「Interface2」を作成しました。 インターフェイスには、メソッド「subjects」のみがあります。 インターフェイスメソッド「subjects」を実装する2番目の親クラスがあります。 次に、最初の親クラスと同様に、リストに要素を追加しました。 次に、子クラス「Details」があります。これは、指定された2つのインターフェイス「Interface1」と「Interface2」を継承します。 子クラスでは、親クラスのオブジェクトを作成し、これらのオブジェクトを使用して「Names」メソッドと「Subjects」メソッドに直接アクセスしました。 インターフェイスは子クラスに継承されるため、「Names」メソッドと「Subjects」メソッドは変更されません。 コードの最後に、子クラスのオブジェクトを宣言して結果を表示するためのメインクラス「Demo」があります。

以下は、インターフェースを使用した複数クラスの継承の実装から得られた結果です。

例3:インターフェースの実装は別のインターフェースを継承します

あるインターフェイスから別のインターフェイスへの継承は、C#で可能です。 クラスが継承されたインターフェイスを定義する場合、継承チェーン内で宣言されたすべてのメンバーを実装する必要があります。 クラスがインターフェースを使用する場合、そのインターフェースによって提供されるすべてのメソッドは、基本インターフェースメソッドと一緒に実装する必要があることに注意してください。 それ以外の場合は、コンパイラーによってエラーがスローされます。 派生インターフェースと基本インターフェースの両方が指定されている場合、派生インターフェースのメンバー名は、基本インターフェースのメンバー名を非表示にします。

前のコードでは、インターフェース「Books」を宣言し、インターフェースにメソッド「Book_no」を作成しました。 アクセス指定子を使用してメソッドを定義していないことに注意してください。 デフォルトでは、インターフェースメソッドはパブリックです。 アクセス指定子を割り当てると、コンパイラはエラーをスローします。 次に、インターフェイス「Books」を継承する別のインターフェイス「Details」を実装しました。 このインターフェースのメソッドもあります。 このクラスは、以前のインターフェースを実装した「Author」という名前で作成されています。 このクラスはインターフェース「Details」のみを継承しますが、ここでは両方のインターフェースのメソッドを継承しました。 最後に、ドライバークラス「Demo」を定義しました。このクラスでは、クラス「Author」のオブジェクトを作成し、これらのオブジェクトを呼び出して「Author」クラスのメソッドにアクセスしました。 次に、これらのメソッドに値を渡しました。

以下は、インターフェイスの継承から別のインターフェイスに取得する出力です。

結論

C#での多重継承の概念について説明しました。 そして、Cでは、1つ以上のインターフェースを同時に利用することで多重継承を実現できるものの、単一の継承のみが許可されることがわかりました。 インターフェースの明確な定義とその重要性があります。 また、サンプルコードにインターフェイスを実装して、C#でインターフェイスを使用する方法を示しました。 さらに、インターフェースを利用すると、クラスの実装が外部から隠されるため、非常に役立ちます。 さて、C#での多重継承について学んだことを願っています。 C#に関するその他の関連トピックは、Linuxヒントで入手できます。

The post C#多重継承 appeared first on Gamingsym Japan.