サブタイピング (計算機科学)
(サブタイピング から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/10/16 08:48 UTC 版)
サブタイピング(英: subtyping)や部分型[1]とは、型のポリモーフィズムの形態であり、上位と定義された型を、その下位と定義された型で、型安全性に則って代替できるというプログラミング言語理論の概念および実装を意味している。
- ^ Benjamin C. Pierce「第Ⅲ部 部分型付け」『型システム入門 −プログラミング言語と型の理論−』オーム社、2013年3月26日。ISBN 978-4274069116。
- ^ Benjamin C. Pierce「15.1 包摂」『型システム入門 −プログラミング言語と型の理論−』オーム社、2013年3月26日。ISBN 978-4274069116。
- 1 サブタイピング (計算機科学)とは
- 2 サブタイピング (計算機科学)の概要
- 3 起源
- 4 例
- 5 性質
- 6 関連項目
サブタイピング
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/05 07:11 UTC 版)
詳細は「サブタイピング (計算機科学)」を参照 いくつかのプログラミング言語では、特定の多相性の状況において使用できる型の範囲を制限するためにサブタイピングを採用している。サブタイピングを使用すると、ある型Tのオブジェクトを受け取る関数は、Tのサブタイプである型Sのオブジェクトを渡された場合でも正しく動作する(リスコフの置換原則)。この型の関係性はしばしばS <: Tと表記される。一般的にサブタイプ多相=インクルージョン多相は動的に解決される(後述)。 次のJavaの例ではAnimalのサブタイプとしてCatとDogを用意する。メソッドletsHear()はAnimal型の引数を受け取るが、そのサブタイプの引数を渡しても問題なく動作する。 abstract class Animal { abstract String talk();}class Cat extends Animal { String talk() { return "Meow!"; }}class Dog extends Animal { String talk() { return "Woof!"; }}class Test { static void letsHear(final Animal a) { System.out.println(a.talk()); } public static void main(String[] args) { letsHear(new Cat()); letsHear(new Dog()); }} オブジェクト指向言語は継承によってサブタイピングを提供する。典型的な実装では、各クラスはそれぞれ仮想関数テーブル(vtable)と呼ばれる関数のテーブルを持ち、各オブジェクトは自らのクラスのvtableへのポインタを持つ。多相なメソッドを呼び出すときには、このvtableを参照する。 多くのオブジェクト指向言語では、仮想関数の呼び出しに1番目の引数(thisオブジェクト)の vtable だけを参照する単一ディスパッチを採用している。つまりその他の引数の実行時の型は仮想関数の呼び出しに全く無関係である。一方でCommon Lispなどでは、メソッドの呼び出しが「全ての」引数に対して多相的となる多重ディスパッチを採用している。
※この「サブタイピング」の解説は、「ポリモーフィズム」の解説の一部です。
「サブタイピング」を含む「ポリモーフィズム」の記事については、「ポリモーフィズム」の概要を参照ください。
サブタイピング
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/05 08:46 UTC 版)
「継承 (プログラミング)」の記事における「サブタイピング」の解説
詳細は「サブタイピング (計算機科学)」を参照 サブタイピング(subtyping)とは、スーパークラスのインスタンスを、サブクラスのインスタンスで安全に代替できることを指針にした継承の用法である。基底クラスの変数への、派生クラスのインスタンスの安全な代入可能性(substitutability)を保証している。これはIs-a関係とも言われる。サブタイピングでは、派生側でのフィールドの追加は抑制され、基底側からのメソッド実装の引き継ぎも抑制されており、基底側からのメソッド定義(メソッドシグネチャ)の引き継ぎが重視されている。派生インスタンスが代入された基底変数のメソッド名から派生メソッド内容が呼び出される言語機能は、メソッドオーバーライドと呼ばれ、その機能概念は動的ディスパッチ(英語版)と呼ばれる。サブタイピングは動的ディスパッチに焦点を当てた継承と解釈できる。 具象メソッド(定義+実装)の引き継ぎは実装継承(implementation inheritance)またはコード継承(code inheritance)と呼ばれており、抽象メソッド(定義だけ)の引き継ぎは界面継承(interface inheritance)と呼ばれている。 Is-a関係サブタイピング主体の継承関係は、UMLクラス図では汎化/特化の関係に投影されている。抽象メソッドだけで構成される純粋抽象クラスは、インターフェースと呼ばれており、それとの継承関係はUMLクラス図では実現/実装の関係に投影されている。 サブタイピングのコーディング例はこうなる。 #include
※この「サブタイピング」の解説は、「継承 (プログラミング)」の解説の一部です。
「サブタイピング」を含む「継承 (プログラミング)」の記事については、「継承 (プログラミング)」の概要を参照ください。
- サブタイピングのページへのリンク