gpt4 book ai didi

java - 我在这个例子中是否违反了 LSP 原则?

转载 作者:行者123 更新时间:2023-11-30 07:47:13 27 4
gpt4 key购买 nike

我有这段代码可以实现两种类型的门。一扇门有锁,另一扇没有。

Door 界面很简单:

public interface Door {
void open();
void close();
}

然后我有实现:LockedDoorRegularDoor

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com