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