看了《敏捷软件开发:原则、模式与实践》的LSP原则那章,感觉很困惑,没有多少分可以给,希望能有高人解答。
困惑源于10.3.1的测试例子:
- C/C++ code
void g(Rectangle& r){ r.SetWidth(5); r.SetHeight(4); assert(r.Area() == 20); }
当一个正方形被传递进这个函数就会发生断言错误。
按照这个例子,我们很多应用了继承并改写了超类方法的类都是明显的违反了LSP原则。
比如以下的继承:
- Java code
Class Father{ String say(){ return "I'am father."; } } Class Son extends Father{ String say(){ return "I'am son."; } }
测试用例类似书上的用例:
- Java code
void g(Father f){ assert(f.say().equals("I'am father.")); }
这样,当把Son传入上面的测试用例就会发生相应的断言错误。
是我的理解有问题,还是说我们这确实是违反了LSP原则呢,请高人解答,谢谢
------解决方案--------------------
再回到楼主的代码,
以你的测试代码为标准:assert(f.say().equals("I'am father."));
说明你希望得到I'am father这个结果,
那么这个继承链条就算再长,你拿重重孙子来,它的say()方法也应该输出I'am father