- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
LSP 说“派生类型不能改 rebase 类型的行为”,换句话说“派生类型必须完全可以替换它们的基类型”。
这意味着如果我们在基类中定义虚方法,我们就违反了这个原则。
另外,如果我们使用 new 关键字在驱动方法中隐藏一个方法,那么我们又违反了这个原则。
换句话说,如果我们使用多态性,我们就违反了 LSP!
在许多应用程序中,我在基类中使用了虚拟方法,现在我意识到它违反了 LSP。另外,如果你使用模板方法模式,你就违反了我经常使用它的原则。
那么,当您需要继承并且还希望从多态性中获益时,如何设计符合此原则的应用程序呢?我很困惑!
请参阅此处的示例:http://www.oodesign.com/liskov-s-substitution-principle.html
最佳答案
Barbara Liskov 有一篇非常好的文章 Data Abstraction and Hierarchy她特别涉及多态行为和虚拟软件构造。读完这篇文章你可以看到,她深入描述了软件组件如何通过简单的多态调用实现灵 active 和模块化。
LSP 说明实现细节,而不是抽象。具体来说,如果您使用 T
类型的某些接口(interface)或抽象,您应该期望传递 T
的所有子类型,而不是观察意外 行为或程序崩溃。
这里的关键字是unexpected,因为它可以描述程序的任何属性(正确性、执行的任务、返回的语义、临时性等)。所以让你的方法 virtual
本身并不意味着违反 LSP
关于c# - 如何遵守 Liskov 替换原则 (LSP) 并仍然受益于多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14403688/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!