首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

迅捷开发的LSP原则的困惑

2013-01-01 
敏捷开发的LSP原则的困惑本帖最后由 zombiebb 于 2011-01-17 12:27:34 编辑看了《敏捷软件开发:原则、模式与

敏捷开发的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

热点排行