正方形是否是长方形的子类?

依据里氏代换原则,子类型必须能够替换掉它们的父类型,子类继承了父类,那么子类可以以父类的身份出现 — 在软件中,把父类都替换成它的子类,程序的行为没有变化。

所以从这个角度而言,正方形并非是长方形的子类。

举个例子,如果长方形中存在一个方法,目的是改变长宽的值,但是正方形只有一个边长,那么就可能出现问题。例如如下代码。

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();
        }
    }

上面是椭圆形的代码。可以改写成矩形来解释这个问题,不过太麻烦我还是先做后面的题目了。