- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这段代码可以实现两种类型的门。一扇门有锁,另一扇没有。
Door 界面很简单:
public interface Door {
void open();
void close();
}
然后我有实现:LockedDoor 和 RegularDoor
public class LockedDoor implements Door {
private Lock lock;
private boolean isOpen;
@Override
public void open() {
if(!lock.isLocked()) {
this.isOpen = true;
}
}
@Override
public void close() {
this.isOpen = false;
}
}
public class RegularDoor implements Door {
private boolean isOpen;
@Override
public void open() {
isOpen = true;
}
@Override
public void close() {
isOpen = false;
}
}
如您所见,LockedDoor
的 open 函数只有在解锁时才会打开门。
您可以通过从 LockedDoor
接收锁并调用它的解锁函数来解锁锁。
是否违反里氏替换原则?
如果是,什么是好的替代方案?
最佳答案
这个问题有点难回答,因为您的 Door
界面似乎不完整,因为不清楚 open()
和 close() 是什么
应该做的。让我们通过添加 isOpen()
方法来清除它,并定义一旦调用 open()
,随后调用 isOpen()
应该返回 true
(为了简洁起见,我故意忽略了如果您尝试打开并且已经打开的门会发生什么的问题)。
在这种情况下,您肯定违反了 LSP 原则 - 如果您试图打开一扇锁着的门,您会失败,而且门会保持关闭状态。
解决此问题的一种方法是为 open()
和 close()
方法添加一个返回值,以便它们可以报告操作是否成功:
public interface Door {
/**
* Checks if the door is open.
* @return {@code true} if the door is open, {@code false} if not.
boolean isOpen();
/**
* Attempt to open the door.
* @return {@code true} if the door was successfully opened,
* {@code false} if not.
* In other words, if a call to {@code open} returns {@code true}, a
* subsequent call to {@link #isOpen} will return {@code true}.
*/
boolean open();
/**
* Attempt to close the door.
* @return {@code true} if the door was successfully closed,
* {@code false} if not.
* In other words, if a call to {@code close} returns {@code true}, a
* subsequent call to {@link #isOpen} will return {@code false}.
*/
void close();
}
public class RegularDoor implements Door {
private boolean isOpen;
@Override
public boolean isOpen() {
return isOpen;
}
@Override
public boolean open() {
return isOpen = true;
}
@Override
public boolean close() {
return isOpen = false;
}
}
public class LockedDoor implements Door {
private Lock lock;
private boolean isOpen;
@Override
public boolean isOpen() {
return isOpen;
}
@Override
public boolean open() {
if (!lock.isLocked()) {
return isOpen = true;
}
return false;
}
@Override
public boolean close() {
return isOpen = false;
}
// Not shown here - methods to lock and unlock the door
}
关于java - 我在这个例子中是否违反了 LSP 原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50036006/
来自 Liskov Substitution Principle - www.blackwasp.co.uk One common indication of non-compliance with
是否可以在 Windows 中使用 LSP(分层服务提供程序)更改传出数据包的目标套接字(IP 和端口)? 例如,我想将所有 HTTP 数据包重定向到代理服务器(给定 IP/端口)。这样我就可以为 W
在 objective-C 中,我可以子类化一个 View Controller ,如下所示。 class KeyboardObserverViewController: UIViewControll
提前为一个冗长的问题道歉。在这里特别感谢反馈。 . . 在我的工作中,我们做了很多关于日期范围的事情(日期周期,如果你愿意的话)。我们需要进行各种测量,比较两个日期周期之间的重叠等。我设计了一个接口(
我的处境与Steve McConnell's 非常相似在Code Complete中有提到。只有我的问题是基于 Vehicles 而 Trike 恰好是根据法律属于 Cars 类别。到目前为止,汽车只
本文实例讲述了PHP面向对象五大原则之里氏替换原则(LSP)。分享给大家供大家参考,具体如下: 替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,
当我注意到this answer时,我一直在阅读里氏替换原理。 。它有一个 Circle 和一个 ColoredCircle 类型,其中 ColoredCircle 的构造函数需要一个额外的参数; 颜
我正在寻找代码中的标志,以表明可能违反里氏替换原则。首先,我创建了一个简单的类和另一个继承它的类: public class Adder { public virtual int Add(in
我正在寻找代码中的标志,以表明可能违反里氏替换原则。首先,我创建了一个简单的类和另一个继承它的类: public class Adder { public virtual int Add(in
我有这段代码可以实现两种类型的门。一扇门有锁,另一扇没有。 Door 界面很简单: public interface Door { void open(); void close();
我有一个名为 Message 的基类,如下所示: public abstract class Message { protected int m_id; protected bool
为了使我的代码可测试,我正在尝试遵守 Liskov's substitution principle让我的 SwiftUI View 依赖于协议(protocol)而不是具体类型。这使我可以轻松地交换
我更多是出于好奇而不是真正关心它 ,但我一直想知道 JavaScript 事件系统是否违反了 Liskov substitution principle (LSP)或不。 调用 EventTarget
序言 是我太久没发了吗?昨天没人看,那么今天来点特别的~ 不仅把好看的视频全部pa下来,咱们还要实现自动评论、点赞、关注三连~ 宝,你也可以顺手给我个三连吗?给你个摸摸大~ 抓包分析流程 我写成了文档
我的 Neovim LSP 错误消息没有红色: 这是我的 vimrc 文件。我真的不知道是什么问题。 syntax on set guicursor= set relativenumber set n
LSP与协方差和逆变之间有什么关系?有什么关系吗? LSP 是协方差的一种形式吗? 最佳答案 我不会这么说Liskov's Substitution Principle是协方差的一种“形式”,就像泛型
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
在emacs中,使用gopls但在我的路径上找不到go。但它在那里,我可以运行它。向社区伸出援手,看看我是否缺少任何东西。我可以毫无问题地运行基本的gin服务器。 使用文档中的config。 输出:
我正在开发 LSP,我需要知道确切的 URL 是什么。 例如,假设用户正在使用 Firefox 浏览页面。我想获取页面的完整 URL,无论是 HTTP 还是 HTTPS。我该怎么做? 我可以通过获取
有谁知道如何调试微软平台SDK提供的LSP示例?我阅读了有关此主题的内容,发现示例 dt_dll 生成了一个 DLL 文件,该文件可与已检查版本的 ws2_32.dll 一起使用。 问题是他们没有说明
我是一名优秀的程序员,十分优秀!