📝ポリモーフィズム

📝ポリモーフィズム

ポリモーフィズム(Polymophism/多相性)とは #

ポリモーフィズムとは, 各要素 (定数, 変数, 式, オブジェクト, 関数, メソッドなど) についてそれらが複数の型に属することを許すという性質. Polymophism, 多相性ともいう.

同種のクラスをカテゴリに分類してまとめ, 基本的な動作・設計部分を統一することで, オブジェクトインスタンスの扱いに柔軟性と規律を持たせるための機能.

多相型は いくつか分類できる.

  • アドホック多相: 関数を適用する型を制限する
  • パラメータ多相: 具体的な型について言及しないことにより, 新しい型に対応できるようにする
  • サブタイプ多相:

たとえば Java だと,

  • アドホック多相: オーバーロード
  • パラメータ多相: ジェネリクス
  • サブタイプ多相: 継承

Polymorphic type: 多相型 #

データ構造のコンテナ.

データ形式に依存しないコンピュータプログラミング方式をジェネリクスプログラミングという.

アドホック多相 #

オブジェクト指向におけるアドホック多相とは, オーバーロードに相当する.

多重定義ともいう.

Clojureもアドホック多相を持つ(multimethod).

パラメータ多相 #

型変数 #

多相型は宣言されたクラス, 関数に対して, 利用時に具体的な型を与える. これを型変数 (Type variable) という.

Java の名前つけルールがあるらしい.

Generic Type: 総称型 #

型付けされたプログラミング言語においてデータ型の定義とそれを参照する式 (型式) の一部にパラメタを許すことによって類似した構造を持つ複数のデータ型を一括して定義して, それらを選択利用する仕組み.

Overload: オーバーロード | 多重定義 #

ref. 多重定義 - Wikipedia, Multi-arity function

プログラミング言語において同一の名前(シンボル)を持つ関数あるいはメソッドおよび同一の演算子記号について複数定義し、利用時にプログラムの文脈に応じて選択することで複数の動作を行わせる仕組み.

継承 (inheritance) と並んでプログラミング言語においてポリモーフィズムを実現するための一つの手段.


オーバーライド: override とたいへん間違えやすい. 注意.

Subtyping: 派生型 #

データ型 S が他のデータ型 T と is-a 関係にあるとき, S を T の派生型 (はせいがた, subtype) であるという.

基本型のデータを処理するように作られたプログラムは, その派生型のデータでも正しく処理することができる.

基本型-派生型関係ではリスコフの置換原則 (Liskov Substitution Principle) が成り立つ.

2 つの方法がある

  • インタフェース: 型をグループで分類
  • 継承: 型を階層構造で分類

inheritance: 継承 #

ほとんどのクラスベースオブジェクト指向言語では, サブクラス (インヘリタンス) が派生型の概念を実現している.

ref: 継承: Inheritance

interface: インタフェース #

ref: インタフェース: Interface

型クラス #

Haskell の概念.

  1. 型は値をグループ化する.
  2. 型クラスは, 型をグループ化する.
  3. その結果, 型クラスの制約が付いた関数は, その型クラスのグループに属していない型には適用できない.
  4. インスタンス化とは当該の型クラスに所属する宣言.

この説明はわかりやすい.

型を分類する点でいえば, Java のインタフェースと同義.

OOP とFPの比較 #

References #