日期:2014-05-20  浏览次数:20863 次

正方形继承长方形违反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一下

------解决方案--------------------