抽象型
抽象クラス(実装継承と型継承の混合)
オブジェクト指向言語における抽象クラスとは、abstractを明示的に宣言されたクラスか、抽象メソッド(メソッドシグネチャの宣言のみで、実際のコードが実装されていないメソッド)を含むクラスである。通常のクラスと異なり、インスタンス化はできない。
実装の多重継承には技術的問題があるため、多くのオブジェクト指向言語では、直接には単一の基底クラスしか継承できない。複数の基底型から成る派生型の定義 (subtyping) をサポートするため、多重継承を「実装継承」ではなく「型継承」に限定する目的で、抽象クラスとは別の純粋な抽象型(インタフェース)を定義する機構を備えた言語もある。
インタフェース(純粋な型継承)
Javaなどにはインタフェースがある。Javaのインタフェースはメソッドのシグネチャや定数を持つことができるが、メソッドの実装や変数(フィールド)を持つことはできない。Javaのクラスは複数のインタフェースを実装 (implement) できる。インタフェースは抽象メンバーのみを含む抽象クラスに似ているが、多重継承できる点が異なる。
Java 8やC# 8のように、言語仕様の改訂によりインタフェースに静的メソッドを定義したり、デフォルト実装を提供したりすることもできるようになったケースもある。
抽象クラスは、以下のようないくつかの方法で生成され、示され、シミュレートされる。
JavaやC#では、クラス定義の際に明示的にキーワード abstract を付与することで抽象クラスであることを示す。
クラス定義の中で、クラスがそのプロトコルの一部として受容することを宣言されているが、実装は提供されないメソッド(抽象メソッド、C++では純粋仮想関数と呼ぶ)を含む場合、そのクラスは抽象クラスである。
抽象型を継承するが、実装が必要な機能(抽象メソッド)をすべてオーバーライドしないクラスもまた抽象クラスである。
Smalltalkなどの動的型付き言語では、自分自身 (this) へ送信するメソッドが実装されていない場合、そのクラスは抽象クラスと見なせる。(ただし、このような実装は単なるバグの可能性もあり、実行してみるまでエラーであることが検出できない。)