2 回答
TA贡献1859条经验 获得超6个赞
尽管这主要是意见,但您应该记住一件事:
public class Child extends Parent implements MyInterface {
public static void main(String[] args) {
Child c = new Child();
c.logSomething("toLog");
}
}
让我们检查一下所有可能的情况:首先,在 Parent 类中有这样一个方法,而不是在接口中。
public class Parent {
public void logSomething(String toLog) {
System.out.println("Parent: " + toLog);
}
}
public interface MyInterface {
}
显然,结果将是:
父:toLog
第二种情况,代码是由接口而不是类提供的。
public class Parent {
}
public interface MyInterface {
default void logSomething(String toLog) {
System.out.println("Interface: " + toLog);
}
}
在这里,它也可以工作,结果将是:
接口:toLog
但是,当两者都提供时:
public class Parent {
public void logSomething(String toLog) {
System.out.println("Parent: " + toLog);
}
}
public interface MyInterface {
default void logSomething(String toLog) {
System.out.println("Interface: " + toLog);
}
}
结果将是:
父:toLog
您是否 100% 确定没有父类,并且永远不会有一个(可能提供(或继承自身))实现或该方法签名?然后是自由选择。
另一方面,如果您选择默认方法,并且有人决定添加父类,则可能会导致一些压力调试。
TA贡献1799条经验 获得超9个赞
至于“经验法则”,我通常会问自己:抽象之间的关系是...
“表现得像”的关系?-> 界面
“是”关系?-> 超类
以这些术语思考使代码库更易于理解,更直观地导航、阅读和维护。
另请记住,您只能从一个超类继承。继承是一种创建高度耦合关系的强契约,因此它应该只在情况需要时使用(在我看来,当概念模型很好地适合“是一种”关系时)。
添加回答
举报