オブジェクト指向プログラミングにおいて、インターフェースまたはプロトコル型[ a ]は、クラスの抽象化として機能するデータ型です。これは、メソッドシグネチャのセットを記述し、その実装は、必ずしも互いに関連していない複数のクラスによって提供される場合があります。[ 1 ]インターフェースにリストされているメソッドを提供するクラスは、インターフェースを実装している[ 1 ]、またはプロトコルを採用している[ 2 ]と言われます。
インターフェースはカプセル化と結合の低減に役立ちます。たとえば、Javaでは、java.lang.Comparable<T>インターフェースはメソッドを指定します。したがって、ソートメソッドは、クラスの内部構造を知ることなく (ただし、これらのオブジェクトのうち 2 つは を介して比較できます) 、 をcompareTo()実装する型のオブジェクトを受け取るだけでソートできます。java.lang.Comparable<T>compareTo()
一部のプログラミング言語は、インターフェースを明示的に言語でサポートしています。Ada 、C#、D、Dart、Delphi、Go、Java、Logtalk、Object Pascal、Objective-C、OCaml、PHP、Racket、Swift、Python 3.8。C ++などの多重継承をサポートする言語では、インターフェースは抽象クラスです。
Javaでは、インターフェースの実装は次のようになります。
class Animal { ... } class Theropod extends Animal { ... }interface Flyable { void fly (); }interface Vocal { void vocalize (); }public class Bird extends Theropod implements Flyable , Vocal { // ... public void fly () { ... } public void vocalize () { ... } }明示的なサポートがない言語では、インターフェースは慣習として存在することが多く、これはダックタイピングとして知られています。たとえば、Pythonでは、任意のクラスがメソッドを実装してイテラブル__iter__として使用できます。[ 3 ]クラスは、ABCを明示的にサブクラス化することもできます。collections.abc.Iterable
Haskellのような言語における型クラスや、MLやOCamlにおけるモジュールシグネチャは、インターフェースとほぼ同じ目的で使用されます。
Rustでは、インターフェースはトレイトと呼ばれます。[ 4 ] Rust では、インターフェースにはstructメソッドは含まれませんが、別のimplブロックを介してメソッドを追加できます。
trait Pet { fn speak ( & self ); }struct Dog { // 構造体にはフィールドのみが含まれますname : String }impl Dog { // トレイト由来ではないfn new ( name : String ) -> Self { Dog { name } } }impl Pet for Dog { // 特性からfn speak ( & self ) { println! ( "{} says 'Woof!'" , self . name ); } }fn main ( ) { let dog = Dog :: new ( String :: from ( "Arlo" )); dog.speak ( ); }C++では、インターフェースに似たものを実現する方法は複数あります。その一つは、抽象クラスを用いるJavaスタイルのインターフェースです。もう一つは、Goのインターフェースに似た概念を用いる方法です。継承とは異なり、概念では、すべての要件を満たしていれば、クラスだけでなく、あらゆる型が概念を満たすことができます。
どのような種類のシステムでも、
特定のタスクを実行するための追加機能を持たせるために、プロトコル
を採用することができます。
{{cite book}}: CS1メンテナンス: 場所の発行元が見つかりません (リンク)