C#の多重継承とは?インターフェースを使った実装方法をわかりやすく解説
C#の多重継承とは?
C#では、クラスに対する多重継承(複数のクラスから同時に継承すること)はサポートされていません。これは、複数の親クラスが同名のメンバーを持つ場合に発生する「ダイヤモンド継承問題」など、コードの曖昧さや競合を避けるための言語設計上の判断です。
しかし、インターフェースを利用すれば、多重継承と同等の機能を実現できます。C#では1つのクラスが複数のインターフェースを実装できるため、これが事実上の多重継承の代替手段として広く使われています。
ステップ1:複数のインターフェースを定義する
まず、基底クラスの代わりとなる2つのインターフェースを作成します。
public interface BaseOne {
void display();
}
public interface BaseTwo {
void display();
}
ステップ2:クラスに複数のインターフェースを実装する
次に、派生クラスを定義するときと同じように、クラス名の後にコロン(:)を付けて、カンマで区切りながら複数のインターフェースを指定します。
public class ChildOne : BaseOne, BaseTwo {
public void display() {
Console.WriteLine("Child Class!");
}
}
完全なサンプルコード
以下は、インターフェースを使ってC#で多重継承を実現する完全なプログラム例です。子クラスのメソッドを呼び出して動作を確認できます。
using System;
namespace Demo {
class Program {
static void Main(string[] args) {
ChildOne c = new ChildOne();
c.display();
Console.ReadKey();
}
}
public interface BaseOne {
void display();
}
public interface BaseTwo {
void display();
}
public class ChildOne : BaseOne, BaseTwo {
public void display() {
Console.WriteLine("Child Class!");
}
}
}
実行結果
Child Class!
補足:同名メソッドを個別に実装したい場合
この例では、両方のインターフェースが同じ display() メソッドを持っているため、1つの実装で両方の契約を満たしています。もし各インターフェースごとに異なる処理を行いたい場合は、明示的なインターフェース実装を使用します。
public class ChildOne : BaseOne, BaseTwo {
// BaseOne用の実装
void BaseOne.display() {
Console.WriteLine("BaseOne の処理");
}
// BaseTwo用の実装
void BaseTwo.display() {
Console.WriteLine("BaseTwo の処理");
}
}
このように書くことで、キャスト先のインターフェースに応じて異なるメソッドが呼び出され、より柔軟な設計が可能になります。
まとめ
- C#はクラスの多重継承をサポートしていない
- インターフェースを複数実装することで、多重継承と同等の構造を実現できる
- 同名メンバーの扱いを分けたい場合は、明示的なインターフェース実装を活用する
-
C#のコンテキストキーワードとは?意味と一覧をわかりやすく解説
C#のコンテキストキーワードとはC#では、コード内で使用される文脈(コンテキスト)によって特別な意味を持つ識別子が存在します。代表的な例が、プロパティのアクセサーとして使われる「get」や「set」です。このように、特定の場面でのみキーワードとして機能する語を「コンテキストキーワード」と呼びます。コンテキストキーワードは、通常の予約語(class や int など)とは異なり、常に予約されているわけではありません。そのため、変数名やメソッド名などの識別子としても自由に使用できるのが大きな特徴です。コンテキストキーワードの一覧以下は、C#で定義されている主なコンテキストキーワードの一覧です。コン
-
C#のConditional属性(条件付き属性)とは?基本構文と使い方を実例で解説
属性(Attribute)は、プログラムにメタデータを追加するための仕組みです。コンパイラへの指示や、コメント・説明文、メソッドやクラスに関する付加情報などをコードに埋め込むことができます。Conditional属性とはConditional属性は、あらかじめ定義されている属性の一つで、指定したプリプロセッサ識別子(シンボル)が定義されている場合にのみ実行される「条件付きメソッド」をマークします。この属性を使用すると、Debug や Trace など、指定されたシンボルの値に応じてメソッド呼び出しの条件付きコンパイルが行われます。たとえば、デバッグ中に変数の値を表示したい場合などに活用できます