依据里氏代换原则,子类型必须能够替换掉它们的父类型,子类继承了父类,那么子类可以以父类的身份出现 — 在软件中,把父类都替换成它的子类,程序的行为没有变化。
所以从这个角度而言,正方形并非是长方形的子类。
举个例子,如果长方形中存在一个方法,目的是改变长宽的值,但是正方形只有一个边长,那么就可能出现问题。例如如下代码。
interface Conic { public long getMajor_axis(); public long getShort_axis(); } class Ellipse implements Conic { private long major_axis; private long short_axis; public void setMajor_axis(long major_axis) { this.major_axis = major_axis; } public long getMajor_axis() { return this.major_axis; } public void setShort_axis(long short_axis) { this.short_axis = short_axis; } public long getShort_axis() { return this.short_axis; } } class Circle implements Conic { private long radius; public void setRadius(long radius) { this.radius = radius; } public long getRadius() { return radius; } public long getMajor_axis() { return getRadius(); } public long getShort_axis() { return getRadius(); } }
上面是椭圆形的代码。可以改写成矩形来解释这个问题,不过太麻烦我还是先做后面的题目了。