インタフェースとは
インタフェース(interface)は、オブジェクト指向プログラミングにおいて重要な役割を果たす抽象型の一つです。特に
JavaやC#といった言語では、クラスによる実装の多重継承が制限されている代わりに、インタフェースを実装することで型の多重継承を実現します。これにより、異なるクラスのオブジェクトを共通のインタフェースを通して扱うことができ、コードの柔軟性や再利用性を高めることができます。
インタフェースの概要
オブジェクト指向プログラミングにおいて、多重継承はプログラミングの自由度と柔軟性を向上させる強力な機能です。
C++のように実装の多重継承をサポートする言語もありますが、菱形継承問題などの複雑な問題を引き起こす可能性があります。これらの問題を回避するため、
JavaやC#では実装の継承を単一継承に制限し、代わりにインタフェースによる型の多重継承を導入しました。
インタフェースはインスタンス化(実体化)することができませんが、クラスでインタフェースを実装することで、そのクラスのインスタンスはインタフェースの型として振る舞うことができます。この原則はリスコフの置換原則に基づいています。
抽象クラスも実装を持たない抽象メソッドを定義できますが、抽象クラスは実装を持つことも可能で、多重継承はできません。インタフェースは基本的に抽象メンバーの宣言のみを持ちますが、言語によっては静的メンバーやデフォルト実装など、より多くの要素を定義できる場合があります。
各言語におけるインタフェース
Javaのインタフェースは、暗黙的な抽象メソッドのみを持つ参照型です。定数や入れ子になった型の定義も許可されています。メンバーのアクセスレベルはデフォルトで`public`です。クラスの継承には`extends`キーワードを使用しますが、インタフェースの実装には`implements`キーワードを使用します。インタフェースを拡張する際は、`extends`キーワードを使用します。
Javaでは、複数の基底クラスを持つ派生クラス群でも、インタフェースを導入することで統一的に扱うことが可能になります。
Java 8以降では、デフォルトメソッドにより限定的に実装の多重継承もサポートされるようになり、インタフェースに静的メソッドを定義することも可能になりました。また、ラムダ式やメソッド参照は、関数型インタフェースによって実現されています。
C#
C#のインタフェースは、
Javaと同様に、抽象メソッド、抽象プロパティ、抽象インデクサ、抽象イベントを持つ参照型です。メンバーのアクセスレベルはデフォルトで`public`です。C# 8.0以降では、定数、入れ子になった型、静的フィールドや静的メソッドの定義、メンバーのデフォルト実装も許可されています。インタフェース名は`I`で始めることが推奨されており、
Delphiのインタフェースの影響を強く受けています。
インタフェースのプロパティは自動実装プロパティに似ていますが、バッキングフィールドは生成されません。C#の構造体は任意のインタフェースを実装できますが、列挙型はできません。`using`ステートメントで使用できる`System.IDisposable`のように、特別扱いされるインタフェース型も存在します。
C#では、`Guid`属性によりインタフェースやクラスにGUIDを付加でき、COM相互運用も可能です。
VB.NET
Visual Basic .NET (VB.NET) もインタフェースをサポートしていますが、抽象メンバーのみを持つ参照型であり、入れ子になった型は定義できるものの、定数や静的メンバー(共有メンバー)は定義できません。
Delphi (Object Pascal) のインタフェースは、暗黙的に`public`な抽象メソッドと抽象プロパティを持つ参照型です。インタフェース型は基本インタフェース`IInterface`または他のインタフェースから派生します。C#の設計者であるアンダース・ヘルスバーグは、
Delphiの開発にも携わっており、C#の初期機能は
Delphiの影響を強く受けています。
UML
統一モデリング言語 (UML) におけるインタフェースは、クラスやコンポーネントが実装すべき操作の集合を定義するモデル要素です。クラス図では、`«interface»`キーワードを含む矩形シンボルで表現されます。
その他の言語・技術
C++では、純粋仮想関数のみを持つクラスを定義することで、
JavaやC#のインタフェースを模倣し、多重継承の欠点を回避することができます。
マイクロソフトのComponent Object Model (COM) は、プログラミング言語を問わず再利用可能なコンポーネントを作成するための技術であり、COMインタフェースは`IUnknown`派生の実装を持たない抽象型として機能します。
まとめ
インタフェースは、オブジェクト指向プログラミングにおける重要な概念であり、型の多重継承、コードの柔軟性、再利用性を向上させるために不可欠です。各言語での実装やUMLでの表現を理解することで、より効果的なプログラミングが可能になります。