读书人

敏捷开发的LSP原则的困惑,该如何解决

发布时间: 2012-03-18 13:55:39 作者: rapoo

敏捷开发的LSP原则的困惑
看了《敏捷软件开发:原则、模式与实践》的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

读书人网 >软件开发

热点推荐