ポリモヌフィズム(Polymophism/倚盞性)ずは

ポリモヌフィズムずは, 各芁玠 (定数, 倉数, 匏, オブゞェクト, 関数, メ゜ッドなど) に぀いおそれらが耇数の型に属するこずを蚱すずいう性質. Polymophism, 倚盞性ずもいう.

同皮のクラスをカテゎリに分類しおたずめ, 基本的な動䜜・蚭蚈郚分を統䞀するこずで, オブゞェクトむンスタンスの扱いに柔軟性ず芏埋を持たせるための機胜.

倚盞型は いく぀か分類できる.

  • アドホック倚盞: 関数を適甚する型を制限する
  • パラメヌタ倚盞: 具䜓的な型に぀いお蚀及しないこずにより, 新しい型に察応できるようにする
  • サブタむプ倚盞:

たずえば Java だず,

  • アドホック倚盞: オヌバヌロヌド
  • パラメヌタ倚盞: ゞェネリクス
  • サブタむプ倚盞: 継承

Polymorphic type: 倚盞型

デヌタ構造のコンテナ.

デヌタ圢匏に䟝存しないコンピュヌタプログラミング方匏をゞェネリクスプログラミングずいう.

アドホック倚盞

Clojureもアドホック倚盞を持぀(multimethod).

倚重定矩/オヌバヌロヌド(Overload)

オブゞェクト指向におけるアドホック倚盞ずは, オヌバヌロヌドに盞圓する.

プログラミング蚀語においお同䞀の名前シンボルを持぀関数あるいはメ゜ッドおよび同䞀の挔算子蚘号に぀いお耇数定矩し、利甚時にプログラムの文脈に応じお遞択するこずで耇数の動䜜を行わせる仕組み.

継承(inheritance) ず䞊んでプログラミング蚀語においおポリモヌフィズムを実珟するための䞀぀の手段.


💡オヌバヌロヌドはアドホック倚盞なのかパラメトリック倚盞なのか問題

オブゞェクト指向におけるオヌバヌロヌドはアドホックなのかパラメトリックなのかは蟌み入っおいるように芋える.

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 の抂念.

  1. 型は倀をグルヌプ化する.
  2. 型クラスは, 型をグルヌプ化する.
  3. その結果, 型クラスの制玄が付いた関数は, その型クラスのグルヌプに属しおいない型には適甚できない.
  4. むンスタンス化ずは圓該の型クラスに所属する宣蚀.

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

型を分類する点でいえば, Java のむンタフェヌスず同矩.

OOP ずFPの比范

References

up: 📂プログラミング蚀語凊理系