継承関係として定義すべきでないものの例
数学的には、「正方形は長方形でもある」ので、SquareはRectangleのサブクラスと見れそう
tsclass 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の利用者は以下のように書けてしまう
tsconst s = new Squre(..);
s.setHeight(2);
s.setWidth(3);
しかしこうすると s
はもはや正方形ではない
親である Rectangle
を使用する気持ちで、 setHeight()
などを使うと、
子である Square
としては不整合が起きている
つまり、親を子に置換可能になっていない
故に、この Rectangle
とこの Square
は継承関係にすべきではない
あるいは、
Rectangle
のモデリングの仕方が適切でない

これは継承云々はあまり関係ないが

モデリングの仕方を工夫すれば、 Rectangle
と Square
に継承関係を入れてもリスコフの置換原則を満たすようなものは定義できるはず
参考