读书人

迅捷开发的LSP原则的困惑

发布时间: 2013-01-01 14:04:20 作者: rapoo

敏捷开发的LSP原则的困惑
本帖最后由 zombiebb 于 2011-01-17 12:27:34 编辑 看了《敏捷软件开发:原则、模式与实践》的LSP原则那章,感觉很困惑,没有多少分可以给,希望能有高人解答。
困惑源于10.3.1的测试例子:


void g(Rectangle& r){
r.SetWidth(5);
r.SetHeight(4);
assert(r.Area() == 20);
}

当一个正方形被传递进这个函数就会发生断言错误。

按照这个例子,我们很多应用了继承并改写了超类方法的类都是明显的违反了LSP原则。
比如以下的继承:

Class Father{
String say(){
return "I'am father.";
}
}

Class Son extends Father{
String say(){
return "I'am son.";
}
}

测试用例类似书上的用例:

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

读书人网 >软件开发

热点推荐