一、什么是里氏代换原则
里氏代换原则(Liskov Substitution Principle):一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别。也就是说,在软件里面,把父类替换成它的子类,程序的行为没有变化。
二、反过来的代换不成立
里氏代换原则(Liskov Substitution Principle):一个软件实体如果使用的是一个子类的话,那么它不能适用于其父类。
三、企鹅是鸟类吗??
四、正方形是一种长方形吗??
正方形不是长方形的子类,因此之间不存在里氏代换关系。
五、好骗的Java编译器
能够骗过Java编译器,真的符合里氏代换原则吗?答案是否定的
六、原来还有一个四边形的概念?
能够骗过Java编译器,真的符合里氏代换原则吗?答案是否定的
代码实现:
父类(四边形):
package com.ibeifeng.ex3;
public interface Sibianxing {
public long getWidth();
public long getHeight();
}
子类(长方形):
package com.ibeifeng.ex3;
public class ChangFX implements Sibianxing{
private long width;
private long height;
public long getWidth() {
return width;
}
public void setWidth(long width) {
this.width = width;
}
public long getHeight() {
return height;
}
public void setHeight(long height) {
this.height = height;
}
}
子类(正方形):
package com.ibeifeng.ex3;
public class ZhengFX implements Sibianxing{
private long side;
public long getHeight() {
return this.getSide();
}
public long getWidth() {
return this.getSide();
}
public void setHeight(long height) {
this.setSide(height);
}
public void setWidth(long width) {
this.setSide(width);
}
public long getSide() {
return side;
}
public void setSide(long side) {
this.side = side;
}
}
测试类:
package com.ibeifeng.ex3;
public class MainClass {
public static void main(String[] args) {
ChangFX changfx = new ChangFX();
changfx.setHeight(10);
changfx.setWidth(20);
test(changfx);
ZhengFX zhengfx = new ZhengFX();
zhengfx.setHeight(10);
test(zhengfx);
}
public static void test(Sibianxing sibianxing) {
System.out.println(sibianxing.getHeight());
System.out.println(sibianxing.getWidth());
}
}
测试结果:
10
20
10
10