b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

里氏替换原则_里氏替换 借口隔离_依赖倒转原则

电脑杂谈  发布时间:2017-03-13 18:14:00  来源:网络整理

依赖倒转原则_里氏替换 借口隔离_里氏替换原则

Robert C. Martin氏为我们总结了在面向对象的设计(OOD)中应该遵循的原则,这些原则被称为“Principles of OOD”,关于“Principles of OOD”的相关文章可以从Object Menter得到。

本文介绍“Principles of OOD”中的里氏替换原则:Liskov Substitution Principle (LSP)。

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

所有引用基类的地方必须能透明地使用其子类的对象。也就是说,只有满足以下2个条件的OO设计才可被认为是满足了LSP原则:

- 不应该在代码中出现if/else之类对子类类型进行判断的条件。以下代码就违反了LSP定义。

if (obj typeof Class1) {

do something

} else if (obj typeof Class2) {

do something else

}

- 子类应当可以替换父类并出现在父类能够出现的任何地方,或者说如果我们把代码中使用基类的地方用它的子类所代替,代码还能正常工作。

里氏替换原则LSP是使代码符合开闭原则的一个重要保证。里氏替换原则同时LSP体现了:

- 类的继承原则:如果一个继承类的对象可能会在基类出现的地方出现运行错误,则该子类不应该从该基类继承,或者说,应该重新设计它们之间的关系。

- 动作正确性保证:从另一个侧面上保证了符合LSP设计原则的类的扩展不会给已有的系统引入新的错误。

类的继承原则:

代码:

class Rectangle {

double width;

double height;

public double getHeight() {

return height;

}

public void setHeight(double height) {

this.height = height;

}

public double getWidth() {

return width;

}

public void setWidth(double width) {

this.width = width;

}

}

class Square extends Rectangle {

public void setHeight(double height) {

super.setHeight(height);

super.setWidth(height);

}

public void setWidth(double width) {

super.setHeight(width);

super.setWidth(width);

}

}

里氏替换 借口隔离_依赖倒转原则_里氏替换原则

这里Rectangle是基类,Square从Rectangle继承。

这种继承关系有什么问题吗?

假如已有的系统中存在以下既有的业务逻辑代码:

void g(Rectangle r) {

r.setWidth(5);

r.setHeight(4);

if (r.getWidth() * r.getHeight() != 20) {

throw new RuntimeException();

}

}

则对应于扩展类Square,在调用既有业务逻辑时:

Rectangle square = new Square();

g(square);

时会抛出一个RuntimeException异常。这显然违反了LSP原则。里氏替换原则


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-37329-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...