2024-02-19

継承は欠陥機能から使うな

class Hoge(Foo) {
  // ...
}

なんてことは論理的にあり得ない。

HogeをFooとみなすかどうかは、一般的文脈によるからだ。

からHoge定義にFooのサブタイであることが課せられるのはおかしい。

ましてや、Fooの実装がinheritされるのは尚更おかしい。

例をあげよう。

カーテン家具でもあるし布製品でもある。

しかし、カーテン家具一種だとみなすか、布製品一種だとみなすかは、文脈による。

からカーテン定義にそれが家具であるとか布製品であるかいう条件が課されるのはおかしい。

インタフェースでも同様である

また、インタフェース実装おかしい。(たとえそれがクラス定義インタフェース実装が分離された場合、いわゆるProtocolというパターン、であっても)

AがBであるとき、AをBとみなす方法一般的には複数あり、どの方法によるかは文脈によるからだ。

たとえば、裏返して着られるパーカークラスWearableインタフェース実装しようとしたら、どちら向きをwear()メソッド実装するか定まらない。

から、A implements Bが一通りしかできない言語論理的に欠陥がある。

継承問題になるのは使い所が難しいからではない。

論理的に間違っているからだ。

  • 関数型言語ならオブジェクトまたはメソッドをクロージャで包むことで動的に派生型を作れるし複数パターン作れる

  • 関数型言語ならオブジェクトまたはメソッドをクロージャで包むことで動的に派生型を作れるし複数パターン作れる

  • 木構造にイテレータを実装するのだってDFSとBFSがあるしな

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん