抽象型

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

ソフトウェア工学における抽象型(ちゅうしょうがた、: abstract type)は、プログラマが宣言する nominative type system における型である。何らかの宣言された派生型のメンバーも共有するメンバーを含む抽象メソッドやプロパティ[1]を含むこともあるし、含まないこともある。多くのオブジェクト指向プログラミング言語では、抽象型を抽象基底クラス (abstract base class)、インタフェース (interface)、TraitMixinflavorsrolesなどと呼ぶ。これらの名称はそれぞれ異なる言語での抽象型の実装を指している。本項目ではこれを総称して抽象クラス (abstract class) と呼ぶ。

抽象クラスの最大の特徴は、オブジェクト指向プログラミングをよりオブジェクト指向的に保つことと、その性質上それが未完成である点である。

抽象型の表示[編集]

抽象クラスは、以下のようないくつかの方法で生成され、示され、シミュレートされる。

  • JavaC#では、クラス定義の際に明示的にキーワード abstract を付与することで抽象クラスであることを示す。
  • クラス定義の中で、そのクラスがプロトコルの一部として受容すると宣言したメソッドC++では純粋仮想関数と呼ぶ)の実装を提供しない場合、そのクラスは抽象クラスである。
  • 抽象型を継承したとき、定義のない必要なメソッドなどをすべて実装しないクラスもまた抽象クラスである。
  • Smalltalkなどの動的型付け言語では、自分自身 (this) へ送信するメソッドが実装されていない場合、そのクラスは抽象クラスと見なせる。(ただし、このような実装は単なるバグの可能性もあり、実行してみるまでエラーであることが検出できない。)

抽象型の使用[編集]

抽象型は、静的型付けのオブジェクト指向言語では重要な機能である。派生型が作成できない言語には存在しない。動的型付け言語の場合は等価な機能は存在しない(ダック・タイピングがあるので抽象型は不要である)。ただし Trait は最近の動的型付け言語に見られる。

派生型のないクラスを「リーフクラス」とし、それ以外を抽象クラスに分類している書籍もある[2]

抽象型は、派生型が実装すべきメソッド群をプロトコルとして規定することができる。多くの言語では抽象型のインスタンスは生成できず、派生型は全ての必要な機能を実装しなければならない。このことはプログラムの正当性を保証する役割を担っている。

抽象型の種類[編集]

抽象型を生成する機構はいくつかある。

  • 完全な抽象基底クラスとは、abstract を明示的に宣言されたクラスか、抽象メソッド(実装されていないメソッド)を含むクラスである。インスタンスが生成できないこと以外は、具象クラスと同じ能力をもつ。完全抽象型は初期のC++に存在した。C++では抽象クラスを生成する言語要素としてだけ、抽象基底クラスが残っている。純粋仮想メソッドだけのクラスは純粋仮想クラスと呼ばれ、必然的に抽象クラスである。
    • 注: C++などの言語での多重継承の技術的問題により、多くのオブジェクト指向言語では直接には単一の基底クラスしか継承できない。複数の派生型をサポートするため、完全抽象基底クラスとは異なる抽象型生成機構を備えた言語もある。
  • Common Lisp Object System には Mixin がある。これは David MoonLisp Machine Lisp のために開発した Flavors を基にしている。なお、CLOS ではクラス内で定義されたメソッドの代わりに、クラスとは別の場所で定義された総称関数を使う。
  • Javaにはインタフェースがある。インタフェースはメソッドのシグネチャや定数をもつことができるが、メソッドの実装や変数をもつことはできない。Javaのクラスは複数のインタフェースが実装できる。Javaにおける抽象クラスは、インタフェースを実装し、いくつかのメソッドのシグネチャを定義し、そこにキーワード abstract を付与したものである。
  • Trait はより新しい手法で、ScalaPerl6roles と呼ばれている)にある。また、Smalltalkの拡張として提案されている(元々、Smaltalk で実装が発展してきた経緯がある)。Trait はその定義内に何を含んでいてもよく、複数の Trait を組み合わせて一つのクラス定義を作ることもできる。この合成規則は標準的な継承とは異なり、多重継承につきものの意味論的な困難さを防ぐようになっている。

脚注・出典[編集]

  1. ^ Abstract Methods and Classes The Java Tutorials
  2. ^ 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

外部リンク[編集]