このページでは、オブジェクト指向における「インターフェース」を取り上げています。全般的な意味での「インターフェース」については、こちらのページを参照してください。
オブジェクト指向プログラミングにおける、実装を持たず、インスタンス化できない抽象型のことです。
プログラミング言語によってその実現方法には違いがあり、たとえば「interface」のようなキーワードを使って定義するものや、ある条件に沿って定義されたクラスがインターフェースとして機能するものなどがあります。
よく似たものに抽象クラスがありますが、抽象クラスの場合は、実装を持ったメソッドや、フィールドを含んでいることがあるのに対し、インターフェースは基本的に、実装を持たないメソッド(抽象メソッド)のみを含みます(ただし、実装時に同じコードがあちこちに重複することを避けるために、実装をもったメソッドを含められる言語もある)。
インターフェースは実装がない抽象メソッドを含んでいるため、そのままインスタンス化することはできません。インスタンス化するには、インターフェースを元にして、新たなクラスを定義し、すべての抽象メソッドに定義を与える必要があります。新たなクラスを定義するコードの記述は、既存のクラスのサブクラスを定義するときとよく似ていることが多いですが、既存のクラスを引き継いだサブクラスを作り出すことを継承と呼ぶのに対して、インターフェースでは(インターフェースの)実装と呼ばれます。つまり、クラスには実装があって、それらを引き継ぐので “継承” であり、インターフェースは実装がなくて、それらを記述するクラスを定義するため “実装” と呼び分けます
インターフェースを活用すると、複数の異なる種類のオブジェクトを、多態性によって統一的にあつかうことができます。つまり、共通のインターフェースから実装されたクラスのオブジェクトa、b、c がそれぞれ異なるクラスのオブジェクトであっても、a.x()
、b.x()
、c.x()
のように同じ扱い方が可能になるのと同時に、x() の具体的なコードをおのおののクラスが別個に実装できます。
また、C++ などの一部のプログラミング言語にある多重継承の実用上の難しさを避けるために、インターフェースを利用できます。多重継承ができない言語でも、複数のインターフェースを実装したクラスを定義することが可能です。
C++ は、言語の仕様としてはインターフェースの機能を持っていませんが、クラスと純粋仮想関数を用いて実現する方法があります。この方法は、抽象クラスを実現する方法と実質的に同じです。
C++ のインターフェースについては、C++編【言語解説】第29章で解説しています。
C++ では多重継承が可能ですが、その適切な運用の難しさを避けるために、インターフェースを活用することがあります。
C++ の多重継承については、C++編【言語解説】第30章で解説しています。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
Twitter でツイート/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |