コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「インタフェース (抽象型)」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m編集の要約なし
タグ: モバイル編集 モバイルウェブ編集 改良版モバイル編集
C#のコード例を追記。出典を追加。
 
(5人の利用者による、間の11版が非表示)
1行目: 1行目:
'''インタフェース''' ({{lang-en-short|interface}}) は、[[Java]]や[[C Sharp|C#]]などの[[オブジェクト指向プログラミング言語]]においてサポートされる、実装を持たない[[抽象型]]のことである。これらの言語において、[[クラス (コンピュータ)|クラス]]は実装の[[多重継承]]をサポートしない代わりに、任意の数のインタフェースを実装 (implement) することができ、これにより型の多重継承をサポートする。複数の種類の[[オブジェクト (プログラミング)|オブジェクト]]を、インタフェースを用いた[[多態性]]によって統一的に扱うことができるようになる。'''インターフェイス'''などと表記することもある<ref>例えば[[オラクル (企業)|オラクル]]の日本語ドキュメントでは「インタフェース」と表記されているが、[[マイクロソフト]]の日本語ドキュメントでは「インターフェイス」と表記されている。本記事では「インタフェース」で統一するものとする。</ref>
'''インタフェース''' ({{lang-en-short|interface}}) は、[[Java]]や[[C Sharp|C#]]などの[[オブジェクト指向プログラミング言語]]においてサポートされる、実装を持たない[[抽象型]]のことである。これらの言語において、[[クラス (コンピュータ)|クラス]]は実装の[[多重継承]]をサポートしない代わりに、任意の数のインタフェースを実装 (implement) することができ、これにより型の多重継承をサポートする。複数の種類の[[オブジェクト (プログラミング)|オブジェクト]]を、インタフェースを用いた[[多態性]]によって統一的に扱うことができるようになる。'''インターフェイス'''や'''インターフェース'''などと表記することもある{{efn|例えば[[オラクル (企業)|オラクル]]の日本語ドキュメントでは「インタフェース」と表記されているが、[[マイクロソフト]]の日本語ドキュメントでは「インターフェイス」と表記されている。[[Google]]の日本語ドキュメントでは「インターフェース」と表記されている。本記事では「'''インタフェース'''」で統一するものとする。}}


== 概要 ==
== 概要 ==
オブジェクト指向プログラミングにおいて、[[多重継承]]はプログラミングの自由度と柔軟性を向上する。[[C++]]は「実装の多重継承」をサポートし、クラスは複数の[[スーパークラス (計算機科学)|スーパークラス]](基底クラス)を持つことができる。しかし、実装の多重継承は[[菱形継承問題]]などの欠点を抱えている。実装の多重継承の問題点を回避するためにC++は[[仮想継承]]の仕組みを導入したが、これはプログラミング言語仕様が複雑化する原因となった。しかし、「型の多重継承」に限れば、問題点の多くは回避でき、また言語仕様もシンプルになる。JavaおよびC#では、実装の継承は単一継承に制限したうえで、代わりに具体的な実装を持たないインタフェースによる型の多重継承の仕組みを導入し、多重継承問題に対する解決策を提供している<ref>{{Cite web|url=https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JF18-Interfaces.pdf|title=進化するJavaインタフェース - Javaの多重継承を理解する -|author=Michael Kölling|accessdate=2019-02-24}}</ref>。
オブジェクト指向プログラミングにおいて、[[多重継承]]はプログラミングの自由度と柔軟性を向上する。[[C++]]は「実装の多重継承」をサポートし、クラスは複数の[[スーパークラス (計算機科学)|スーパークラス]](基底クラス)を持つことができる。しかし、実装の多重継承は[[菱形継承問題]]などの欠点を抱えている。実装の多重継承の問題点を回避するためにC++は[[仮想継承]]の仕組みを導入したが、これはプログラミング言語仕様が複雑化する原因となった。しかし、「型の多重継承」に限れば、問題点の多くは回避でき、また言語仕様もシンプルになる。JavaおよびC#では、実装の継承は単一継承に制限したうえで、代わりに具体的な実装を持たないインタフェースによる型の多重継承の仕組みを導入し、多重継承問題に対する解決策を提供している<ref>{{Cite web|和書|url=https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JF18-Interfaces.pdf|title=進化するJavaインタフェース - Javaの多重継承を理解する -|author=Michael Kölling|accessdate=2019-02-24}}</ref>。


インタフェース自身はインスタンス化(実体化)することができないが、任意のクラスにてインタフェースを実装することで、そのクラスのインスタンスは当該インタフェースとして振る舞うことが可能となる([[リスコフの置換原則]])。
インタフェース自身はインスタンス化(実体化)することができないが、任意のクラスにてインタフェースを実装することで、そのクラスのインスタンスは当該インタフェースとして振る舞うことが可能となる([[リスコフの置換原則]])。


JavaおよびC#では、抽象[[メソッド (計算機科学)|メソッド]](実装を持たないメソッド宣言)を持ち、実体化できないクラス(抽象クラス)を定義することも可能であるが、抽象クラスは実装を持つことも可能であり、インタフェースと違って多重継承することはできない。
JavaおよびC#では、抽象[[メソッド (計算機科学)|メソッド]](実装を持たないメソッド宣言)を持ち、実体化できないクラス(抽象クラス)を定義することも可能であるが、抽象クラスは実装を持つことも可能であり、インタフェースと違って多重継承することはできない。

インタフェース型に含めることのできる構文要素は、具体的な実装を持たない抽象メンバーの宣言のみが基本であるが、後述のように詳細は言語ごとに異なる。利便性の観点から、言語仕様の改訂(バージョンアップ)により制限が部分的に緩和され、静的メンバーの実装など、インタフェースに定義可能な要素が増えるケースもある。


== Java ==
== Java ==
Javaのインタフェースは、暗黙的にpublicな抽象メソッドのみを持つことが許される参照型である。定数および入れ子になった型の定義は許される。Javaではクラスの継承に<code>extends</code>キーワードを使用するが、インタフェースの実装には<code>implements</code>キーワードを使用する。インタフェースを拡張して新たなインタフェースを派生させるときは<code>extends</code>キーワードを使う。
Javaのインタフェースは、暗黙的な抽象メソッドのみを持つことが許される参照型である。定数および入れ子になった型の定義は許される。メンバーのアクセスレベルはデフォルトで{{code|public|java}}となる。Javaではクラスの継承に{{code|extends|java}}キーワードを使用するが、インタフェースの実装には{{code|implements|java}}キーワードを使用する。インタフェースを拡張して新たなインタフェースを派生させるときは{{code|extends|java}}キーワードを使う。
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
// 「飛ぶ」ことができるもの全般を表すインタフェース。
// 「飛ぶ」ことができるもの全般を表すインタフェース。
78行目: 80行目:


== C# ==
== C# ==
C#のインタフェースは、概ねJava同様であり、暗黙的にpublicな抽象メソッド、抽象[[プロパティ (プログラミング)|プロパティ]]、抽象[[インデクサ]]のみを持つことが許される参照型である。ただし、定数および入れ子になった型の定義は許されな。インタフェース名は<code>I</code>で始めることが推奨されている。言語の機能や設計の観点から言うと、C#のインタフェースには[[Delphi]] ([[Object Pascal]]) のインタフェースの影響が強く見られる。
C#のインタフェース<ref>[https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/interface interface キーワード - C# reference | Microsoft Learn]</ref>は、概ねJava同様であり、暗黙的な抽象メソッド、抽象[[プロパティ (プログラミング)|プロパティ]]<ref>[https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/interface-properties インターフェイスのプロパティ - C# | Microsoft Learn]</ref>、抽象[[インデクサ]]<ref>[https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/indexers/indexers-in-interfaces インターフェイスのインデクサー - C# | Microsoft Learn]</ref>、抽象[[デリゲート (プログラミング)|イベント]]<ref>[https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/events/how-to-implement-interface-events インターフェイス イベントを実装する方法 - C# | Microsoft Learn]</ref>のみを持つことが許される参照型である。メンバーのアクセスレベルはデフォルトで{{code|public|csharp}}となる<ref>[https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers#other-types アクセス修飾子 - C# | Microsoft Learn]</ref>。C# 7.xまでは、定数入れ子になった型、静的フィールドや静的メソッドなどの定義は許されなかったが、C# 8.0以降では定義できるようになった<ref>[https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods Default interface methods - C# feature specifications | Microsoft Learn]</ref>。また、C# 8.0ではメンバーのデフォルト実装を定義することもできるようになった<ref>[https://learn.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-version-history#c-version-80 C# の歴史 / §C# バージョン 8.0 | Microsoft Learn]</ref>。インタフェース名は<code>I</code>で始めることが推奨されている<ref>[https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces クラス、構造体、およびインターフェイスの名前 - Framework Design Guidelines | Microsoft Docs]</ref>。言語の機能や設計の観点から言うと、C#のインタフェースには[[Delphi]] ([[Object Pascal]]) のインタフェースの影響が強く見られる。


<syntaxhighlight lang="csharp">
C#の[[構造体]]は抽象クラス<code>System.ValueType</code>から暗黙的に派生する値型であり、基底クラスを明示的に指定することはできないが、任意のインタフェースを実装することはできる。C#の列挙型は抽象クラス<code>System.Enum</code>から暗黙的に派生する値型であるが、構造体とは違って任意のインタフェースを実装することはできない。構造体および列挙型のインスタンスは、実装されたインタフェース型の変数に暗黙的に代入できるが、[[型変換]](キャスト)の際に[[ボックス化]]が発生する。
interface IMyInterface
{
// メソッド宣言。
void SomeMethod();
// プロパティ宣言。型、名前、読み書きの方向を宣言する。
double SomeProperty { get; set; }
// インデクサ宣言。
string this[int index] { get; set; }
// イベント宣言。
event System.EventHandler SomethingChanged;
}
</syntaxhighlight>
インタフェースのプロパティはC# 3.0以降の自動実装プロパティと類似の構文だが、インタフェースは状態を持たないため、{{code|abstract|csharp}}プロパティ<ref>[https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/how-to-define-abstract-properties 抽象プロパティを定義する方法 - C# | Microsoft Learn]</ref>同様にバッキングフィールドは生成されない。


C#の[[構造体]]は抽象クラス<code>System.ValueType</code>から暗黙的に派生する値型であり、基底クラスを明示的に指定することはできないが、任意のインタフェースを実装することはできる<ref>[https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/struct 構造体型 - C# リファレンス | Microsoft Docs]</ref>。C#の列挙型は抽象クラス<code>System.Enum</code>から暗黙的に派生する値型であるが、構造体とは違って任意のインタフェースを実装することはできない。構造体および列挙型のインスタンスは、実装されたインタフェース型の変数に暗黙的に代入できるが、[[型変換]](キャスト)の際に[[ボックス化]]が発生する。
usingステートメントで使用できる<code>System.IDisposable</code>のように、構文上特別扱いされるようになるインタフェース型もある。

usingステートメントで使用できる<code>System.IDisposable</code>のように、構文上特別扱いされるようになるインタフェース型もある<ref>[https://docs.microsoft.com/en-us/dotnet/api/system.idisposable#using-an-object-that-implements-idisposable IDisposable Interface (System) | Microsoft Docs]</ref>


また、C#では<code>Guid</code>属性(<code>System.Runtime.InteropServices.GuidAttribute</code>クラス)により、インタフェースやクラスに[[GUID]]を付加することができる。[[.NET Framework]]のインタフェースやクラスを含む[[アセンブリ (共通言語基盤)|アセンブリ]]をCOMコンポーネントとして公開し、C++ネイティブコードや[[VBScript]]/[[JScript]]といった従来のCOM/[[Object Linking and Embedding|OLE]]対応言語などから利用するCOM相互運用も可能である<ref>[https://docs.microsoft.com/ja-jp/dotnet/framework/interop/exposing-dotnet-components-to-com COM への .NET Framework コンポーネントの公開 | Microsoft Docs]</ref>。
また、C#では<code>Guid</code>属性(<code>System.Runtime.InteropServices.GuidAttribute</code>クラス)により、インタフェースやクラスに[[GUID]]を付加することができる。[[.NET Framework]]のインタフェースやクラスを含む[[アセンブリ (共通言語基盤)|アセンブリ]]をCOMコンポーネントとして公開し、C++ネイティブコードや[[VBScript]]/[[JScript]]といった従来のCOM/[[Object Linking and Embedding|OLE]]対応言語などから利用するCOM相互運用も可能である<ref>[https://docs.microsoft.com/ja-jp/dotnet/framework/interop/exposing-dotnet-components-to-com COM への .NET Framework コンポーネントの公開 | Microsoft Docs]</ref>。

== VB.NET ==
C#の姉妹言語である[[Visual Basic .NET]] (VB.NET) もインタフェースをサポートし、抽象メンバーのみを持つ参照型である点は同じだが、入れ子になった型は定義できるものの、定数や静的メンバー(共有メンバー)などの定義は許されない<ref>[https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/interfaces/ インターフェイス - Visual Basic | Microsoft Docs]</ref>。

== Delphi ==
[[Delphi]] ([[Object Pascal]]) のインタフェースは、暗黙的にpublicな抽象メソッドと抽象プロパティのみを持つことが許される参照型である<ref>[https://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88_%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9 オブジェクト インターフェイス(Delphi) - RAD Studio]</ref>。インタフェース型は、基本インタフェース<code>IInterface</code>または他のインタフェースから派生する。

C#の設計者[[アンダース・ヘルスバーグ]]は、マイクロソフトに移籍する前は[[ボーランド]]にてDelphiの開発に従事していた。特に初期のC#の言語機能はDelphiの影響を強く受けており<ref>[https://news.mynavi.jp/article/programinglanguageoftheworld-22/ 世界のプログラミング言語(22) 今も改良が続くPascal/Delphi言語の栄枯盛衰 | TECH+]</ref>、インタフェースに関しても例外ではない。

== UML ==
[[統一モデリング言語]] (UML) におけるインタフェースは、クラスまたは[[ソフトウェアコンポーネント|コンポーネント]]などの他のモデル要素が実装しなければならない、操作 (operation) の集合を定義するモデル要素である。ある実装モデル要素は、あるインタフェースが宣言する各操作をオーバーライドすることで、そのインタフェースを実現する<ref>[https://www.ibm.com/docs/en/rsas/7.5.0?topic=diagrams-interfaces Interfaces - IBM Documentation]</ref>。UMLのクラス図では、«interface»のキーワードを含むクラスの矩形シンボルによって表現される。


== その他の言語・技術 ==
== その他の言語・技術 ==
91行目: 119行目:
[[マイクロソフト]]の[[Component Object Model]] (COM) は、プログラミング言語を問わず再利用可能な[[ソフトウェアコンポーネント]]を作成するために用いられる技術であり、COMインタフェースは[[IUnknown]]派生の実装を持たない抽象型として、COMサーバーとCOMクライアントをつなぐ役割を果たす。COMの思想や概念はのちに[[.NET Framework]]や[[Windowsランタイム]]にも受け継がれることになった。
[[マイクロソフト]]の[[Component Object Model]] (COM) は、プログラミング言語を問わず再利用可能な[[ソフトウェアコンポーネント]]を作成するために用いられる技術であり、COMインタフェースは[[IUnknown]]派生の実装を持たない抽象型として、COMサーバーとCOMクライアントをつなぐ役割を果たす。COMの思想や概念はのちに[[.NET Framework]]や[[Windowsランタイム]]にも受け継がれることになった。


== 脚注・出典 ==
== 脚注 ==
{{脚注ヘルプ}}
=== 注釈 ===
{{Notelist}}
=== 出典 ===
{{Reflist}}
{{Reflist}}



2024年7月20日 (土) 08:29時点における最新版

インタフェース (: interface) は、JavaC#などのオブジェクト指向プログラミング言語においてサポートされる、実装を持たない抽象型のことである。これらの言語において、クラスは実装の多重継承をサポートしない代わりに、任意の数のインタフェースを実装 (implement) することができ、これにより型の多重継承をサポートする。複数の種類のオブジェクトを、インタフェースを用いた多態性によって統一的に扱うことができるようになる。インターフェイスインターフェースなどと表記することもある[注釈 1]

概要

[編集]

オブジェクト指向プログラミングにおいて、多重継承はプログラミングの自由度と柔軟性を向上する。C++は「実装の多重継承」をサポートし、クラスは複数のスーパークラス(基底クラス)を持つことができる。しかし、実装の多重継承は菱形継承問題などの欠点を抱えている。実装の多重継承の問題点を回避するためにC++は仮想継承の仕組みを導入したが、これはプログラミング言語仕様が複雑化する原因となった。しかし、「型の多重継承」に限れば、問題点の多くは回避でき、また言語仕様もシンプルになる。JavaおよびC#では、実装の継承は単一継承に制限したうえで、代わりに具体的な実装を持たないインタフェースによる型の多重継承の仕組みを導入し、多重継承問題に対する解決策を提供している[1]

インタフェース自身はインスタンス化(実体化)することができないが、任意のクラスにてインタフェースを実装することで、そのクラスのインスタンスは当該インタフェースとして振る舞うことが可能となる(リスコフの置換原則)。

JavaおよびC#では、抽象メソッド(実装を持たないメソッド宣言)を持ち、実体化できないクラス(抽象クラス)を定義することも可能であるが、抽象クラスは実装を持つことも可能であり、インタフェースと違って多重継承することはできない。

インタフェース型に含めることのできる構文要素は、具体的な実装を持たない抽象メンバーの宣言のみが基本であるが、後述のように詳細は言語ごとに異なる。利便性の観点から、言語仕様の改訂(バージョンアップ)により制限が部分的に緩和され、静的メンバーの実装など、インタフェースに定義可能な要素が増えるケースもある。

Java

[編集]

Javaのインタフェースは、暗黙的な抽象メソッドのみを持つことが許される参照型である。定数および入れ子になった型の定義は許される。メンバーのアクセスレベルはデフォルトでpublicとなる。Javaではクラスの継承にextendsキーワードを使用するが、インタフェースの実装にはimplementsキーワードを使用する。インタフェースを拡張して新たなインタフェースを派生させるときはextendsキーワードを使う。

// 「飛ぶ」ことができるもの全般を表すインタフェース。
interface Flyable {
    void fly();
}

// 動物の抽象基底クラス。
abstract class Animal {
}

// 鳥類の抽象基底クラス。空を飛べないダチョウやペンギンも含まれる。
abstract class Bird extends Animal {
}

// 飛べる鳥類の抽象基底クラス。
abstract class FlyingBird extends Bird implements Flyable {
}

// ワシの具象クラス。
class Eagle extends FlyingBird {
    @Override
    public void fly() { System.out.println("Eagle.fly()"); }
}

// 哺乳類の抽象基底クラス。
abstract class Mammal extends Animal {
}

// 飛べる哺乳類の抽象基底クラス。
abstract class FlyingMammal extends Mammal implements Flyable {
}

// コウモリの具象クラス。
class Bat extends FlyingMammal {
    @Override
    public void fly() { System.out.println("Bat.fly()"); }
}

// 航空機の抽象基底クラス。自力で航行できないグライダーも含まれる。
abstract class Aircraft {
}

// エンジンを搭載した飛行機の具象クラス。
class Airplane extends Aircraft implements Flyable {
    @Override
    public void fly() { System.out.println("Airplane.fly()"); }
}

public class Main {
    public static void main(String[] args) {
        final Flyable[] flyables = {
            new Eagle(),
            new Bat(),
            new Airplane(),
        };
        for (final Flyable obj : flyables) {
            obj.fly();
        }
    }
}

上記では、互いに異なる基底クラスを持つ派生クラス群であっても、Flyableインタフェースを導入することで一様に扱うことができる例を示している。

Javaの列挙型は抽象クラスjava.lang.Enumから暗黙的に派生する参照型であり、任意のインタフェースを実装することができる。

なお、Java 8以降ではインタフェースのデフォルトメソッドにより、実装の多重継承も限定的にサポートするようになった。また、インタフェースが静的メソッドを持つこともできるようになった[2]。Java 8で導入されたラムダ式およびメソッド参照は、実装すべきメソッドをひとつだけ持つ「関数型インタフェース」(functional interface) によって実現されている。

C#

[編集]

C#のインタフェース[3]は、概ねJava同様であり、暗黙的な抽象メソッド、抽象プロパティ[4]、抽象インデクサ[5]、抽象イベント[6]のみを持つことが許される参照型である。メンバーのアクセスレベルはデフォルトでpublicとなる[7]。C# 7.xまでは、定数、入れ子になった型、静的フィールドや静的メソッドなどの定義は許されなかったが、C# 8.0以降では定義できるようになった[8]。また、C# 8.0ではメンバーのデフォルト実装を定義することもできるようになった[9]。インタフェース名はIで始めることが推奨されている[10]。言語の機能や設計の観点から言うと、C#のインタフェースにはDelphi (Object Pascal) のインタフェースの影響が強く見られる。

interface IMyInterface
{
    // メソッド宣言。
    void SomeMethod();
    // プロパティ宣言。型、名前、読み書きの方向を宣言する。
    double SomeProperty { get; set; }
    // インデクサ宣言。
    string this[int index] { get; set; }
    // イベント宣言。
    event System.EventHandler SomethingChanged;
}

インタフェースのプロパティはC# 3.0以降の自動実装プロパティと類似の構文だが、インタフェースは状態を持たないため、abstractプロパティ[11]同様にバッキングフィールドは生成されない。

C#の構造体は抽象クラスSystem.ValueTypeから暗黙的に派生する値型であり、基底クラスを明示的に指定することはできないが、任意のインタフェースを実装することはできる[12]。C#の列挙型は抽象クラスSystem.Enumから暗黙的に派生する値型であるが、構造体とは違って任意のインタフェースを実装することはできない。構造体および列挙型のインスタンスは、実装されたインタフェース型の変数に暗黙的に代入できるが、型変換(キャスト)の際にボックス化が発生する。

usingステートメントで使用できるSystem.IDisposableのように、構文上特別扱いされるようになるインタフェース型もある[13]

また、C#ではGuid属性(System.Runtime.InteropServices.GuidAttributeクラス)により、インタフェースやクラスにGUIDを付加することができる。.NET Frameworkのインタフェースやクラスを含むアセンブリをCOMコンポーネントとして公開し、C++ネイティブコードやVBScript/JScriptといった従来のCOM/OLE対応言語などから利用するCOM相互運用も可能である[14]

VB.NET

[編集]

C#の姉妹言語であるVisual Basic .NET (VB.NET) もインタフェースをサポートし、抽象メンバーのみを持つ参照型である点は同じだが、入れ子になった型は定義できるものの、定数や静的メンバー(共有メンバー)などの定義は許されない[15]

Delphi

[編集]

Delphi (Object Pascal) のインタフェースは、暗黙的にpublicな抽象メソッドと抽象プロパティのみを持つことが許される参照型である[16]。インタフェース型は、基本インタフェースIInterfaceまたは他のインタフェースから派生する。

C#の設計者アンダース・ヘルスバーグは、マイクロソフトに移籍する前はボーランドにてDelphiの開発に従事していた。特に初期のC#の言語機能はDelphiの影響を強く受けており[17]、インタフェースに関しても例外ではない。

UML

[編集]

統一モデリング言語 (UML) におけるインタフェースは、クラスまたはコンポーネントなどの他のモデル要素が実装しなければならない、操作 (operation) の集合を定義するモデル要素である。ある実装モデル要素は、あるインタフェースが宣言する各操作をオーバーライドすることで、そのインタフェースを実現する[18]。UMLのクラス図では、«interface»のキーワードを含むクラスの矩形シンボルによって表現される。

その他の言語・技術

[編集]

C++ではpublicな純粋仮想関数および純粋仮想デストラクタのみを持つクラス(あるいは構造体)を定義することで、JavaやC#のインタフェースを模倣し、多重継承の欠点を回避することもできる。

マイクロソフトComponent Object Model (COM) は、プログラミング言語を問わず再利用可能なソフトウェアコンポーネントを作成するために用いられる技術であり、COMインタフェースはIUnknown派生の実装を持たない抽象型として、COMサーバーとCOMクライアントをつなぐ役割を果たす。COMの思想や概念はのちに.NET FrameworkWindowsランタイムにも受け継がれることになった。

脚注

[編集]

注釈

[編集]
  1. ^ 例えばオラクルの日本語ドキュメントでは「インタフェース」と表記されているが、マイクロソフトの日本語ドキュメントでは「インターフェイス」と表記されている。Googleの日本語ドキュメントでは「インターフェース」と表記されている。本記事では「インタフェース」で統一するものとする。

出典

[編集]

関連項目

[編集]