抽象型
抽象型の最新ニュースをまとめて検索!
ソフトウェア工学における抽象型(ちゅうしょうがた、英: abstract type)は、プログラマが宣言する nominative type system における型である。何らかの宣言された派生型のメンバーも共有するメンバーを含む抽象メソッドやプロパティ[1]を含むこともあるし、含まないこともある。多くのオブジェクト指向プログラミング言語では、抽象型を抽象基底クラス (abstract base class)、インタフェース (interface)、Trait、Mixin、flavors、rolesなどと呼ぶ。これらの名称はそれぞれ異なる言語での抽象型の実装を指している。本項目ではこれを総称して抽象クラス (abstract class) と呼ぶ。
抽象クラスの最大の特徴は、オブジェクト指向プログラミングをよりオブジェクト指向的に保つことと、その性質上それが未完成である点である。
目次 |
[編集] 抽象型の表示
抽象クラスは、以下のようないくつかの方法で生成され、示され、シミュレートされる。
- JavaやC#では、クラス定義の際に明示的にキーワード abstract を付与することで抽象クラスであることを示す。
- クラス定義の中で、そのクラスがプロトコルの一部として受容すると宣言したメソッド(C++では純粋仮想関数と呼ぶ)を明記するが、その実装はクラス定義内で提供しない場合、そのクラスは抽象クラスである。
- 抽象型を継承したとき、定義のない必要なメソッドなどをすべて実装しないクラスもまた抽象クラスである。
- Smalltalkなどの動的型付け言語では、自分自身 (this) へメソッドを送信するが、そのメソッドが実装されていない場合、そのクラスは抽象クラスと見なせる。ただしこのような実装法は単なるバグの可能性もあり、実行してみるまでエラーを検出できない。
[編集] 抽象型の使用
抽象型は、静的型付けのオブジェクト指向言語では重要な機能である。派生型を作成できない言語には存在しない。動的型付け言語の場合は等価な機能は存在しない(ダック・タイピングがあるので抽象型は不要である)。ただし Traits は最近の動的型付け言語に見られる。
書籍などでは、派生型のないクラスを「リーフクラス」とし、それ以外を抽象クラスに分類する場合もある[2]。
抽象型は、派生型が実装すべきメソッド群をプロトコルとして規定することができる。多くの言語では抽象型のインスタンスを生成できず、派生型は全ての必要な機能を実装しなければならない。このことはプログラムの正当性を保証する役割を担っている。
[編集] 抽象型の種類
抽象型を生成する機構はいくつかある。
- 完全な抽象基底クラスとは、abstract を明示的に宣言されたクラスか、抽象メソッド(実装されていないメソッド)を含むクラスである。インスタンスを生成できない以外は、具象クラス/型と同じ能力を有する。完全抽象型は初期のC++に存在した。C++では抽象クラスを生成する言語要素としてのみ抽象基底クラスが残っている。純粋仮想メソッドのみのクラスは純粋仮想クラスと呼ばれ、必然的に抽象クラスである。
- Common Lisp Object System には Mixin がある。これは David Moon が Lisp Machine Lisp のために開発した Flavors をベースとしている。なお、CLOSではクラス内で定義されたメソッドの代わりに、クラスとは別の場所で定義された総称関数を使う。
- Javaにはインタフェースがある。インタフェースはメソッドのシグネチャや定数を持つことができるが、メソッドの実装や変数を持つことはできない。Javaのクラスは複数のインタフェースを実装できる。Javaにおける抽象クラスは、インタフェースを実装し、いくつかのメソッドのシグネチャを定義し、そこに "abstract" キーワードを付与したものである。
- Trait はより新しい手法で、Scala や Perl 6(roles と呼ばれている)にある。また、Smalltalkの拡張として提案されている(元々、Smaltalkで実装が発展してきた経緯がある)。Traitはその定義内に何を含んでいてもよく、複数のTraitを組み合わせて1つのクラス定義を作ることもできる。この合成規則は標準的な継承とは異なり、多重継承につきものの意味論的な困難さを防ぐようになっている。
[編集] 脚注・出典
- ^ Abstract Methods and Classes The Java Tutorials
- ^ Riel, Arthur (1996). Object-Oriented Design Heuristics. Addison-Wesley Professional. 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

