generated at
継承関係として定義すべきでないものの例
継承を使用できる条件を満たしていないものの例



数学的には、「正方形は長方形でもある」ので、SquareはRectangleのサブクラスと見れそう
ts
class Rectangle { constructor(public height: number, public width: number) {} setHeight(height: number) { this.height = height; } setWidth(width: number) { this.width = width; } } class Square extends Rectangle { setSide(side: number) { this.setHeight(side); this.setWidth(side); } }

しかし、Squreの利用者は以下のように書けてしまう
ts
const s = new Squre(..); s.setHeight(2); s.setWidth(3);
しかしこうすると s はもはや正方形ではない


親である Rectangle を使用する気持ちで、 setHeight() などを使うと、
子である Square としては不整合が起きている
つまり、親を子に置換可能になっていない

故に、これはリスコフの置換原則 (LSP)を満たしていない

故に、この Rectangle とこの Square は継承関係にすべきではない
あるいは、 Rectangle のモデリングの仕方が適切でないmrsekut
これは継承云々はあまり関係ないがmrsekut
モデリングの仕方を工夫すれば、 Rectangle Square に継承関係を入れてもリスコフの置換原則を満たすようなものは定義できるはず

参考