当前位置: 首页 > 知识库问答 >
问题:

如果地址从电话号码继承,它违反了什么OOP原则?

薄龙光
2023-03-14

有一本书谈到拥有一个PhoneNumber类,然后我们将定义一个继承自PhoneNumberAddress类,我曾经说过,我们不能这样做,因为地址不是电话号码,要继承,它必须是一个“is a”关系。例如:狗是一种动物,我们可以让继承动物

但是由于我们必须遵循LSP--Liskov替换原则,“是a”规则实际上不是这里的决定因素,因为正方形“是”矩形(宽度=高度),但是LSP说我们不能定义square类并从Rectangle类继承。我认为,用英语简单的解释是,objectaRect可以响应消息setwidth和height(w,h),但是aSquare不能正确响应它并允许整个程序正确运行。

因此,令人惊讶的是,继承PhoneNumber类的Address类违反了“is a”关系,但它没有违反LSP。那么在形式上,它违反了什么OOP原则?

共有2个答案

洪涵亮
2023-03-14

使用继承或扩展主要有两个原因。

  1. 重复使用实施(适用于干式)

我不知道所有的原则,但对于你的情况,它违反了@mpm评论的常识。

因为即使您的代码满足所有原则,它仍然可能是不合适的。换句话说,原则不能涵盖一切。

尹乐邦
2023-03-14

首先,这确实违反了LSP。

一般来说,您不会期望能够用地址代替电话号码。这是每个人在评论中谈论的“常识”。

OOP理论的要点是,遵循形式化规则将使您的类对变化和奇怪的用例具有健壮性。即使书中的例子没有因为LSP冲突而崩溃,我想如果你试图扩展这个类架构,它也会很快崩溃。因此,为了避免将来类中可能出现的错误,您应该遵循LSP——即使选择不这样做不会立即破坏任何东西。

其次,它违反了ISP(接口隔离原则)。

这说明类中可用的方法集应该是类的对象运行所需的最小值。

如果Address类继承(或可能合理地继承)一组PhoneNumber方法,而这些方法在处理实际街道地址时从未使用过(例如getAreaCode()方法,这对于房屋地址是未定义的),那么它的接口就不是最小的。

其要点是OOP原则实际上只是指导方针。毫无疑问,我们可以编写一些奇怪的示例代码,这些代码违反了一个坚实的原则,但实际上并没有引入bug。这并不意味着你在逃避规则;这只意味着一旦你试图扩展这个类,你就会遇到更多的bug。

 类似资料:
  • 这是使用com.android.support:appcompat-v7:22.2.0 删除autoLink参数将不会发生冲突。 有办法解决吗?

  • 问题内容: 我要输入电话号码,包括国家代码,分机号 如果tel_number大于15位,可以使用哪种数据类型,最好使用? 例如,如果我有加拿大的国家代码,则可以使用+2或002。哪个更适合处理? 谢谢你的建议。 问题答案: 好吧,我个人不使用数字数据类型来存储电话号码或相关信息。 您如何存储说001234567的数字?最终结果为1234567,丢失了前导零。 当然,您始终可以将其左移,但前提是您确

  • 我已经和Java一起工作了几年,但是直到最近我还没有遇到过这个结构: 这可能是一个非常简单的问题,但是有人能解释一下吗?我怎么读?我很确定我知道它是如何工作的。 < li >如果< code>isHere为true,则调用< code>getHereCount(), < li >如果< code>isHere为false,则调用< code>getAwayCount()。 正确吗?这个构造叫什么?

  • 问题内容: 我正在开发一个使用angular作为客户端框架的应用程序,目前使用angular作为岩石,我真的很高兴,尽管现在我发现我经常复制和粘贴要组织成类层次结构的代码。例如,对话框共享一组通用的功能,需要打开,关闭它们,提供功能的代码也是从某些父BaseTypeaheadClass继承的首选对象,尽管我在angular中没有发现的一件事是组织这些层次结构。控制器,服务和提供者都在下面使用普通的

  • 我看到了一些与我要求的相似的问题,但似乎没有什么符合要求的。 我处于需要处理通话记录并使用电话号码确定国家的位置。拨打的号码可以是任何国家,例如: 44 7899455120-英国 34 965791845-西班牙 355 788415235-阿尔巴尼亚 显然,如果所有的呼叫代码都是两位数的话,这个世界将是美好的,但事实并非如此。目前,我有一个数据库,里面有国家及其相关代码,为了匹配,我需要有效地

  • 问题内容: 我想在HTML文档中将电话号码标记为可调用链接。我已经读过微格式方法,并且我知道该方案是标准的,但实际上没有任何实现。 Skype的定义,因为据我所知,和,后者已经获得了一定的知名度。我认为,其他公司有其他计划,也有可能参与其中。 标记电话号码的最佳做法是什么,以便使尽可能多的使用VoIP软件的人可以单击链接来拨打电话? 额外的问题:有人知道紧急电话的并发症吗,例如美国的911或德国的