ポリモーフィズム(Polymophism/多相性)とは
ポリモーフィズムとは, 各要素 (定数, 変数, 式, オブジェクト, 関数, メソッドなど) についてそれらが複数の型に属することを許すという性質. Polymophism, 多相性ともいう.
同種のクラスをカテゴリに分類してまとめ, 基本的な動作・設計部分を統一することで, オブジェクトインスタンスの扱いに柔軟性と規律を持たせるための機能.
多相型は いくつか分類できる.
- アドホック多相: 関数を適用する型を制限する
- パラメータ多相: 具体的な型について言及しないことにより, 新しい型に対応できるようにする
- サブタイプ多相:
たとえば Java だと,
- アドホック多相: オーバーロード
- パラメータ多相: ジェネリクス
- サブタイプ多相: 継承
- refs:
Polymorphic type: 多相型
データ構造のコンテナ.
データ形式に依存しないコンピュータプログラミング方式をジェネリクスプログラミングという.
アドホック多相
Clojureもアドホック多相を持つ(multimethod).
多重定義/オーバーロード(Overload)
オブジェクト指向におけるアドホック多相とは, オーバーロードに相当する.
プログラミング言語において同一の名前(シンボル)を持つ関数あるいはメソッドおよび同一の演算子記号について複数定義し、利用時にプログラムの文脈に応じて選択することで複数の動作を行わせる仕組み.
継承(inheritance) と並んでプログラミング言語においてポリモーフィズムを実現するための一つの手段.
- オーバーライド(override) とたいへん間違えやすい. 注意.
- 多重定義 - Wikipedia, Multi-arity function
💡オーバーロードはアドホック多相なのかパラメトリック多相なのか問題
オブジェクト指向におけるオーバーロードはアドホックなのかパラメトリックなのかは込み入っているように見える.
ref. 「アドホック多相 vs パラメトリック多相」をマジメに考えてはいけない - 檜山正幸のキマイラ飼育記 (はてなBlog)
- アドホック多相: 単一の名前が、複数の異なる関数を指している。
- パラメトリック多相: 単一の名前が指す(単一の)関数が、複数の異なる型で使用できる
わたしも雰囲気で理解することにした.
パラメータ多相
パラメトリック多相とも.
型変数
多相型は宣言されたクラス, 関数に対して, 利用時に具体的な型を与える. これを型変数 (Type variable) という.
Java の名前つけルールがあるらしい.
Generic Type: 総称型
型付けされたプログラミング言語においてデータ型の定義とそれを参照する式 (型式) の一部にパラメタを許すことによって類似した構造を持つ複数のデータ型を一括して定義して, それらを選択利用する仕組み.
Subtyping: 派生型
データ型 S が他のデータ型 T と is-a 関係にあるとき, S を T の派生型 (はせいがた, subtype) であるという.
基本型のデータを処理するように作られたプログラムは, その派生型のデータでも正しく処理することができる.
基本型-派生型関係ではリスコフの置換原則 (Liskov Substitution Principle) が成り立つ.
2 つの方法がある
- インタフェース: 型をグループで分類
- 継承: 型を階層構造で分類
inheritance: 継承
ほとんどのクラスベースオブジェクト指向言語では, サブクラス (インヘリタンス) が派生型の概念を実現している.
ref: 継承: Inheritance
interface: インタフェース
ref: インタフェース: Interface
型クラス
Haskell の概念.
- 型は値をグループ化する.
- 型クラスは, 型をグループ化する.
- その結果, 型クラスの制約が付いた関数は, その型クラスのグループに属していない型には適用できない.
- インスタンス化とは当該の型クラスに所属する宣言.
この説明はわかりやすい.
型を分類する点でいえば, Java のインタフェースと同義.
OOP とFPの比較
- オブジェクト指向はクラスでインヘリタンス
- 関数型は代数的データ型で選択
References
- ポリモーフィズム - Wikipedia
- 型システム入門
👉Related
up: 📂プログラミング言語処理系