我正在学习 SOLID 原则,ISP 指出:
不应强迫客户依赖他们不使用的接口。
在接口中使用默认方法是否违反了这个原则?
我已经看到了一个类似的问题,但是如果我的示例违反了 ISP,我将在此处发布一个示例,以便更清楚地了解情况。假设我有这个例子:
public interface IUser{
void UserMenu();
String getID();
default void closeSession() {
System.out.println("Client Left");
}
default void readRecords(){
System.out.println("User requested to read records...");
System.out.println("Printing records....");
System.out.println("..............");
}
}
使用以下类实现 IUser 接口
public class Admin implements IUser {
public String getID() {
return "ADMIN";
}
public void handleUser() {
boolean sessionIsOpen = true;
while (sessionIsOpen) {
switch (Integer.parseInt(in.readLine())) {
case 1 -> addNewUser();
case 2 -> sessionIsOpen=false;
default -> System.out.println("Invalid Entry");
}
}
closeSession();
}
private void addNewUser() {
System.out.println("Adding New User..."); }
}
}
编辑类:
public class Editor implements IUser {
public String getID() {
return "EDITOR";
}
public void handleUser() {
boolean sessionIsOpen=true;
while (sessionIsOpen){
switch (Integer.parseInt(in.readLine())) {
case 1 -> addBook();
case 2 -> readRecords();
case 3 -> sessionIsOpen=false;
default ->
System.out.println("Invalid Entry");
}
}
closeSession();
}
private void addBook() {
System.out.println("Adding New Book..."); }
}
}
观众类
public class Viewer implements IUser {
public String getID() {
return "Viewer";
}
public void handleUser() {
boolean sessionIsOpen=true;
while (sessionIsOpen){
switch (Integer.parseInt(in.readLine())) {
case 1 -> readRecords();
case 2 -> sessionIsOpen=false;
default ->
System.out.println("Invalid Entry");
}
}
closeSession();
}
}
由于编辑器和查看器类使用 readRecords() 方法,而 Admin 类不提供该方法的实现,我将其作为 IUser 接口中的默认方法实现,以最大限度地减少代码重复(DRY 原则)。
我是不是因为Admin类没有使用read方法而在IUser中使用默认方法违反了上面代码中的接口隔离原则?
有人可以解释一下,因为我认为我不会强迫 Admin 类使用他们不使用的方法/接口。