3里氏代换原则LSP

时间:2023-03-09 15:25:11
3里氏代换原则LSP

一、什么是里氏代换原则

  里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个父类的话,那 么一定适用于其子类,而且它察觉不出父类和子 类对象的区别。也就是说,在软件里面,把父类 替换成它的子类,程序的行为没有变化。

二、反过来的代换不成立

  里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个子类的话,那 么它不能适用于其父类。

三、企鹅是鸟类吗??

3里氏代换原则LSP

四、正方形是一种长方形吗??

3里氏代换原则LSP

正方形不是长方形的子类,因此之间不存在里氏代换关系。

五、好骗的Java编译器

3里氏代换原则LSP

六、原来还有一个四边形的概念?

3里氏代换原则LSP

能够骗过Java编译器,真的符合里氏代换原则吗?答案是否定的

 public class Person {
public void display() {
System.out.println("this is person");
}
}

男人

 public class Man extends Person {

     public void display() {
System.out.println("this is man");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
Person person = new Person();
// display(person); Man man = new Man();
display(man);
} public static void display(Man man) {
man.display();
}
}

=================================================================

ex2:

鸟  接口

 //鸟
public interface Bird {
public void fly();
}

老鹰

 //老鹰
public class Laoying implements Bird { public void fly() {
System.out.println("老鹰在飞");
}
}

麻雀

 //麻雀
public class Maque implements Bird { public void fly() {
System.out.println("麻雀在飞");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
fly(new Laoying());
} public static void fly(Bird bird) {
bird.fly();
}
}

=============================================================

ex3:

四边形  接口

 //四边形
public interface Sibianxing {
public long getWidth();
public long getHeight();
}

长方形

 //长方形
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;
}
}

正方形

 //正方形
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;
}
}

测试

 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());
} // public static void resize(Sibianxing sibianxing) {
// while(sibianxing.getHeight() <= sibianxing.getWidth()) {
// sibianxing.setHeight(sibianxing.getHeight() + 1);
// test(sibianxing);
// }
// }
}