Golang には継承がない、という指摘について少し調べたメモ
元ネタ
なぜGo言語 (golang) はよい言語なのか・Goでプログラムを書くべき理由
Goには継承はありません。 そもそも継承はプログラミング言語にあまり必要ない機能だと思います。 継承が本当に有益なこともありますが、経験上大半のケースでは設計を手抜きするために継承が使われていて、結果長い目で見た際のreadabilityやmaintainabilityが著しく劣化してしまっていることが多いと思います。Composition over inheritanceやリスコフの置換原則のような基本的な原則が守られておらず(そもそも多くの人は名前すら知らない)、単に一部のコードをクラス間で共有するために継承が使われていて可読性が著しく低いコードもよく目にします。
そのため、そもそもプログラミング言語が継承をサポートしないというのは非常に良いデザインだなと思います。継承が非常に有益な場合も稀にあるもの分かりますが、大規模プロジェクトにおいては正しく使われない害のほうが確実に大きいです。
Composition over inheritance
継承をもちいた場合の構成、というくらいの意味
Composition over inheritance - Wikipedia
リスコフの置換原則
一般的なやつ
T 型のオブジェクト x に関して真となる属性を q(x) とする。このとき S が T の派生型であれば、 S 型のオブジェクト y について q(y) が真となる。
- オブジェクト x がある
- オブジェクト x の型は T である
- オブジェクト x は 属性 q(x) をもつ
- q(x) の導出は true である
型S が 型T の subtypeであるとき、以下も成り立つ
- オブジェクト y がある
- オブジェクト y の型は S である
- q(y) の導出は true である