派生型

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

コンピュータサイエンスにおいて、データ型S が他のデータ型Tis-a関係にあるとき、ST派生型(はせいがた、subtype)であるという。またTS基本型(きほんがた、supertype)であるという。基本型のデータを処理するように作られたプログラムは、その派生型のデータでも正しく処理することができる。つまり、基本型-派生型関係ではリスコフの置換原則(Liskov Substitution Principle)[1]が成り立つ。とは言っても、実際のプログラミング言語では独自の型の派生(subtyping)の概念を採用していることもあり、またそのような概念を持たないこともある。

[編集]

例をとおして、派生型について考える。「鳥」という基本型と「アヒル」「ガチョウ」「ハクチョウ」という3つの派生型を仮定する。それぞれの派生型は「鳥」という抽象概念を別々の形で具体化しているが、「鳥」としての多くの特徴を継承し共有している。データは4つのうちのどの型のインスタンスとしても宣言できる。

ほとんどのクラスベースオブジェクト指向言語では、サブクラスが派生型の概念を実現している。AB のサブクラスだったなら、AインスタンスB のインスタンスが期待されるあらゆる場面で使用可能となる(インタフェースの継承)。それゆえAB の派生型であるといえる。ここで重要なことは、B を型として宣言された変数は実行時にA 型の値を持っているかもしれない、ということである。多くのオブジェクト指向プログラマはこの状況を、B をその変数の静的型A をその変数の動的型である、と表現する。 この規則の例外には、派生型を作らずに実装の継承ができる言語(private inheritance[2]のあるC++など)や基本型から継承した機能を派生型で取り除くことができる言語(Eiffelなど)がある。

別の例を考える。浮動小数点数と整数で同じコードを共有したい場合に、整数が浮動小数点数の派生型となる場合と、整数と実数を包含するnumber型が定義されている場合が考えられる。プログラマは型の派生を利用することで、それを使わない場合よりも抽象化したコードが書けることがある。

function max (x as number, y as number)
  if x < y then
    return y
  else
    return x
end

この関数には整数と実数のどちらの値でも渡すことができる。このため、型の派生はポリモーフィズムの一形態と考えられることが多い。上記の例はC++のテンプレートとも比較される。

型理論においては、派生型関係は<:と表記される。つまり、A <: Bという表記はAB の派生型であるという意味である。型理論における型の派生は、A <: Bならば型A を持つ式はどれでも型B をも持つという事実によって特性付けられる。この形式的な推論規則は「包摂」として知られている。

型の派生方式[編集]

型理論の研究者は、派生型であると宣言されたもののみを派生型とするnominal subtyping(nominative; 公称型)と、2つの型の構造によって派生型関係にあるかが決まるstructural subtyping(structural; 構造型)を区別する。上記のクラスベースオブジェクト指向言語の例は公称型である。構造型のオブジェクト指向言語では、型A のオブジェクトが型B のオブジェクトの処理できるメッセージすべてを処理できるなら(言い換えると、同じメソッドを実装していれば)、継承関係に関係なく、AB の派生型となる。

型の派生を持つプログラミング言語の実装は大きく2つに分類される。型A の値の内部表現が型B の値としての内部表現も兼ねるinclusive(包含的)な実装と、型A の値が型B の値に「自動的に変換」されることのあるcoercive(強制的)な実装である。オブジェクト指向言語のサブクラスによる型の派生はたいてい包含的である。前述の整数と浮動小数点数の派生型関係は、内部表現が異なっているので、強制的な例である。

ほぼすべての型システムでは型の派生関係が定義されている。それは反射律(型A について、A <: A)と推移律(A <: BかつB <: CならばA <: C)を満たすものである。つまり前順序が成り立つ。

関連項目[編集]

参考資料[編集]

外部リンク[編集]