抽象型
型システム |
---|
主要カテゴリ |
静的型付け vs 動的型付け 強い vs 弱い 明示的 vs 型推論 名前的 vs 構造的 ダックタイピング |
マイナーカテゴリ |
部分型 再帰型 部分構造型 依存型 漸進的型付け フロータイピング 潜在的型付け |
型理論のコンセプト |
直積型 - 直和型 交差型 - 共用型 単一型 - 選択型 帰納型 - 精製型 トップ型 - ボトム型 函数型 - 商型 全称型 - 存在型 一意型 - 線形型 |
抽象型(ちゅうしょうがた、英: abstract type)とは、コンピュータプログラミングの型システムで扱われる型の一種であり、コードやデータの実装から解放(free)された型という意味合いを持っている。記名的型付けに準拠したものとされている。型理論では、関数適用される存在型がそれと同等になる。
オブジェクト指向プログラミングでよく用いられており、その各言語では、抽象クラスやインターフェースやプロトコルなどの形態にされている。例えばJavaでの抽象型は、抽象クラスとインターフェースである[1]。
抽象型の例
抽象クラスは、以下のようないくつかの方法で生成され、示され、シミュレートされる。
- JavaやC#では、クラス定義の際に明示的にキーワード
abstract
を付与することで抽象クラスであることを示す。 - クラス定義の中で、クラスがそのプロトコルの一部として受容することを宣言されているが、実装は提供されないメソッド(抽象メソッド、C++では純粋仮想関数と呼ぶ)を含む場合、そのクラスは抽象クラスである。
- 抽象型を継承するが、実装が必要な機能(抽象メソッド)をすべてオーバーライドしないクラスもまた抽象クラスである。
- Smalltalkなどの動的型付き言語では、自分自身 (this) へ送信するメソッドが実装されていない場合、そのクラスは抽象クラスと見なせる。(ただし、このような実装は単なるバグの可能性もあり、実行してみるまでエラーであることが検出できない。)
抽象型の性質
抽象型は、もっぱら静的型付けのオブジェクト指向言語の機能であり、サブタイピングされる記名的型システムの変数の型付け(typing)に用いられるものである。
動的型付けのオブジェクト指向言語では、構造的型システムのダックタイピングで変数が解釈されるので、抽象型の機能は不要になる。変数から抽象型の仕様メンバにあたるものが直接照会されるからであり、この場合の変数は、個々の仕様メンバをまとめているアドホック多相シンボルと同義になる。
派生型のないクラスを「リーフクラス」とし、それ以外を抽象クラスに分類している書籍もある[2]。
抽象型は、派生型が実装すべきメソッド群をプロトコルとして規定することができる。多くの言語では抽象型のインスタンスは生成できず、派生型は全ての必要な機能を実装しなければならない。このことはプログラムの正当性を保証する役割を担っている。
抽象型の種類
- オブジェクト指向言語で言われる抽象クラスとは、
abstract
を明示的に宣言されたクラスか、抽象メソッド(メソッドシグニチャ定義だけで実行コード実装されていないメソッド)を含むクラスである。通常のクラスと異なり、インスタンス化はできない。抽象メソッドだけで構成されたクラスは純粋抽象クラスと呼ばれる。言語によっては純粋抽象クラスをインターフェースと別定義している。
継承用シンボル(Mix-inでの総称関数のパターンマッチング用)
- Common Lisp(CLOS) は、Flavors由来の Mix-inの作法を備えている。Common Lisp ではメソッドを束ねたものを総称関数としてクラス定義からは独立させているため多重継承での競合問題が発生しにくい。そこでは総称関数のパターンマッチングでの識別用に特化されたクラス名シンボルが一種の抽象型になる。なお、この総称関数向けのクラス名シンボルはアドホック多相とも解釈される。
- Javaなどにはインターフェースがある。インタフェースはメソッドのシグネチャや定数をもつことができるが、メソッドの実装や変数(フィールド)をもつことはできない。Javaのクラスは複数のインタフェースを実装できる。Javaにおける抽象クラスは、インタフェースを実装し、いくつかのメソッドのシグネチャを定義していることもあるが、一方でキーワード
abstract
により抽象化されたままのメソッドを持っている。
- トレイトが抽象型に当たるのかは諸説分かれる。トレイトは構造的型付けに準拠しており、その本質は、クラスに機能注入するためのメソッドの集合体だからである。これをRubyはモジュールと呼び、Rakuはロールと呼んでいる。トレイトはSmalltalk処理系由来であり、上述のCLOSのMix-inの作法もヒントになっていた。
- 多重継承前提のトレイトは、主に関数型を取り入れたオブジェクト指向言語で様々に解釈されるようになり、その中にはインターフェースとの類似形もあったので、これが抽象型と見なされる一因になっている。
型クラス(アドホック多相由来のジェネリック・サブタイピング)
- 元々の型クラスは純粋関数型言語で、関数のパラメータ型に制約(constraint)を付加して関数オーバーロードを可能にするための手段であり、そのオーバーロードをジェネリック化していた。制約の付加はアドホック多相と解釈された。その制約を、サブタイピングされるジェネリック抽象型にしてデータクラスやレコード型や構造体に継承できるようにしたものが、オブジェクト指向言語で言われる型クラスになっている。
プロトコル(インターフェースとトレイトの融合)
脚注・出典
- ^ Abstract Methods and Classes The Java Tutorials
- ^ Riel, Arthur (1996). Object-Oriented Design Heuristics. Addison-Wesley Professional. p. 89. ISBN 020163385X
参考文献
- Types and Programming Languages by Benjamin Pierce (MIT Press 2002) [1]
- More Effective C++: 35 New Ways to Improve Your Programs and Designs by Scott Meyers (1995) ISBN 0-201-63371-X
外部リンク
- Traits: Composable Units of Behavior by Nathanael Schärli, Stéphane Ducasse, Oscar Nierstrasz and Andrew Black