抽象型とは
抽象型とは、コンピュータプログラミングの
型システムにおける概念の一つで、特に名前的
型システムにおいて重要な役割を果たします。抽象型の最大の特徴は、直接
インスタンスを生成できないという点にあります。これは、抽象型が具体的な実装を持たないか、あるいは不完全な実装しか持たないためです。
抽象型と具象型
抽象型と対比される概念として、具象型があります。具象型は、抽象型とは異なり、
インスタンス化が可能です。例えば、クラスベースの
オブジェクト指向プログラミング言語では、抽象型は抽象クラスとして実装され、具象型は具象クラスとして実装されます。
抽象型の実装
抽象型の具体的な実装は、プログラミング言語によって異なります。多くの言語では、抽象型はインターフェースやプロトコルとして表現されます。これらのインターフェースやプロトコルは、メソッドのシグネチャのみを定義し、実際の動作は実装しません。
Javaでは、抽象クラスとインターフェースが抽象型に相当します。抽象クラスは、`abstract`キー
ワードで宣言されたクラスで、抽象メソッドを含むことも、含まないこともあります。また、インターフェースは、メソッドのシグネチャのみを定義するもので、実装を持つことはできません。
抽象型の表記方法
抽象型は、プログラミング言語によって様々な方法で表現されます。
`abstract`キーワード: JavaやC#では、クラス定義時に`abstract`キーワードを付与することで、そのクラスが抽象クラスであることを示します。
抽象メソッド: クラス内に抽象メソッド(実装を持たないメソッド)が含まれる場合、そのクラスは抽象クラスとなります。
*
未実装のメソッド: 抽象型を継承したクラスが、抽象メソッドをすべて
オーバーライドしない場合も、そのクラスは抽象クラスとなります。
抽象型の性質
抽象型は、
静的型付けのオブジェクト指向言語において特に重要です。抽象型を用いることで、派生型が実装すべきメソッド群をプロトコルとして規定することができます。また、抽象型の
インスタンスを直接生成できないため、派生型がすべての必要な機能を実装することを強制し、プログラムの正当性を保証する役割を担います。
抽象型の種類
抽象型は、大きく分けて以下の3つの種類があります。
1.
抽象クラス: 抽象クラスは、`abstract`キー
ワードで明示的に宣言されたクラスや、抽象メソッドを含むクラスです。
インスタンス化することはできません。
2.
インターフェース: インターフェースは、メソッドのシグネチャのみを定義するもので、実装を持つことはできません。
Javaでは、クラスは複数のインターフェースを実装することができます。
3.
プロトコル:
Objective-CやSwiftにおけるプロトコルは、メソッドやプロパティの宣言を持つことができますが、実装を持つことはできません。クラスや
構造体、列挙型は複数のプロトコルを採用することができます。
各種抽象型の詳細
抽象クラス
オブジェクト指向言語における抽象クラスは、`abstract`を明示的に宣言されたクラスか、抽象メソッドを含むクラスです。多重継承には技術的な問題があるため、多くのオブジェクト指向言語では、直接には単一の基底クラスしか継承できません。複数の基底型から成る派生型の定義をサポートするため、多重継承を「実装継承」ではなく「型継承」に限定する目的で、抽象クラスとは別の純粋な抽象型(インタフェース)を定義する機構を備えた言語もあります。
インタフェース
Javaなどの言語では、インタフェースはメソッドのシグネチャや定数を持つことができますが、メソッドの実装や変数(フィールド)を持つことはできません。
Javaのクラスは複数のインタフェースを実装することができます。インタフェースは抽象メンバーのみを含む抽象クラスに似ていますが、多重継承できる点が異なります。
Java 8やC# 8のように、言語仕様の改訂によりインタフェースに静的メソッドを定義したり、デフォルト実装を提供したりすることもできるようになりました。
プロトコル
Objective-CとSwiftにはプロトコルがあります。プロトコルはメソッドやプロパティの宣言を持つことができますが、それらの実装や変数(状態)を持つことはできません。
Objective-Cのクラスや、Swiftのクラス・
構造体・列挙型は複数のプロトコルを採用 (adopt) できます。プロトコルのメンバーにはrequiredとoptionalの種別があり、requiredの実装は必須ですが、optionalの実装は任意です。Swift 2.0では、プロトコル拡張 (protocol extension) により、既存のプロトコルにメソッドの実装やcomputedプロパティの実装を追加することができるようになりました。
その他の抽象型に関する概念
トレイト
トレイトが抽象型に当たるのかは諸説分かれます。トレイトは構造的型付けに準拠しており、その本質は、クラスに機能注入するためのメソッドの集合体だからです。トレイトはSmalltalk処理系由来であり、Mix-inの作法もヒントになっていました。
型クラスは、純粋関数型言語で、関数のパラメータ型に制約を付加して関数オーバーロードを可能にするための手段です。その制約を、サブタイピングされるジェネリック抽象型にしてデータクラスやレコード型や
構造体に継承できるようにしたものが、オブジェクト指向言語で言われる
型クラスになっています。
まとめ
抽象型は、プログラミングにおける柔軟性と保守性を高めるための重要な概念です。抽象型を理解し、適切に利用することで、より堅牢で拡張性の高いソフトウェアを開発することができます。