Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 面向对象设计访谈_Oop_Design Patterns - Fatal编程技术网

Oop 面向对象设计访谈

Oop 面向对象设计访谈,oop,design-patterns,Oop,Design Patterns,在为下周即将到来的采访做准备时,我正在阅读史蒂夫·耶格的《5个基本电话屏幕问题》,我偶然发现了以下摘录: 例如,您可能会找到一位决定某一车辆类别的候选人 应该是ParkingGarage的子类,因为车库包含汽车。 这是刚刚破裂的,它是不可修复的,在任何合理的数量 训练时间 由于对OO设计缺乏经验,我试图理解为什么这是一个错误的假设?继承是一种“是”的关系 汽车是汽车 车辆不是停车库 停车场可能包含许多车辆,但这是组合,而不是继承增加了Evan的答案: 说到继承,尊重“是一种”(或“是一种”)关系

在为下周即将到来的采访做准备时,我正在阅读史蒂夫·耶格的《5个基本电话屏幕问题》,我偶然发现了以下摘录:

例如,您可能会找到一位决定某一车辆类别的候选人 应该是ParkingGarage的子类,因为车库包含汽车。 这是刚刚破裂的,它是不可修复的,在任何合理的数量 训练时间

由于对OO设计缺乏经验,我试图理解为什么这是一个错误的假设?

继承是一种“是”的关系

汽车
汽车

车辆
不是停车库


停车场可能包含许多车辆,但这是组合,而不是继承

增加了Evan的答案:

说到继承,尊重“是一种”(或“是一种”)关系并不是全部

一个好的设计也将牢记LSP(Liskov替代原则)。 该原理表明,如果B是a的一个亚型,那么a可以被B取代,而不会产生任何令人惊讶的效果。例如,与
车辆
配合使用的任何代码也将与
车辆
配合使用

显示打破这一原则有多么容易的经典示例是方形-矩形示例

乍一看,让正方形从矩形继承似乎很明显。正方形“是一种”矩形。它是一个矩形,其宽度和高度总是相同的值。 为了保持此属性,您可能会将Square类设计为:

public class Square : Rectangle
{    
  //SetWidth method inherited from Rectangle
  public override void SetWidth(int width) {
    base.width = width;
    base.height = width;
  }
}
太好了。但现在,想象一下下面的代码:

public void SomeMethod(Rectangle rect) {
  rect.SetHeight(10);
  rect.SetWidth(20);
  print(rect.GetHeight());
}
这段代码期望第三行打印10,因为它只是将矩形的高度设置为10。然而,如果替换为正方形,它将打印20,从而导致意外行为,并打破了Liskov替换原则。所以我们看到矩形不能总是被正方形代替

LSP是五个坚实的原则之一——我建议多阅读其他四个原则

如果你正在寻找一本好的面向对象的书,我必须说,头优先设计模式是一本地狱般的书,是我读过的最好的一本。
它与java有点关系,但只是有点关系,他们将其用于代码示例,而不是其他。它应该是语言不可知的,无论您的编程背景如何,您都可以阅读它。

谢谢。我可以问一些关于好的OO相关材料的建议吗?我似乎找不到一本与语言无关的书/教程(尤其是Python),非常感谢您的时间和这篇出色的回复。你能告诉我你推荐我阅读的其他4条可靠原则是什么吗?@user3043746。这些对于设计一个灵活且可维护的应用程序是必不可少的,也是一个在面试中保持缄默的好方法。