正方形继承长方形违反liskov原则?
几乎所有的将Liskov原则的文章都提到了“正方形继承长方形违反Liskov原则”。
但都说的不清不楚的
假设我有如下的两个类,请问哪个地方违反了Liskov原则呢?
public class Rectangle ...{
protected double width;
protected double height;
public double getWidth() ...{
return width;
}
public void setWidth(double width) ...{
this.width = width;
}
public double getHeight() ...{
return height;
}
public void setHeight(double height) ...{
this.height = height;
}
public double calcSize() ...{
return this.height * this.width;
}
}
public class Square extends Rectangle ...{
@Override
public void setHeight(double height) ...{
setEdge(height);
}
@Override
public void setWidth(double width) ...{
setEdge(width);
}
@Override
public double getHeight() ...{
return getEdge();
}
@Override
public double getWidth() ...{
return getEdge();
}
public double getEdge() ...{
return this.height;
}
public void setEdge(double edge) ...{
this.height = edge;
this.width = edge;
}
}
------解决方案--------------------这样看来好像是 Robert C.Martin 曲解了里氏替换原则的本意。
------解决方案--------------------不知道什么叫“liskov原则”,但
《effective C++ 第三版》里面讨论过这个问题 可以参考p154-p155
其大致的解释为:
一些可以运用在矩形上的方法(比如单独增加矩形的长或者宽)却不能运用在正方形上(因为正方形必须长和宽一致)。
简单的说:
“能够施行于base class对象上的每件事情,也可以施行于derived class对象身上”
------解决方案--------------------这些我不是很清楚
但也up一下
------解决方案--------------------