提取“超类”或“接口”?有没有“经验法则”?

当识别不同类中的相同代码时,我们如何决定是将其提取到接口中还是超类中?由于接口不能保存任何属性,说起来很简单(“经验法则”):

如果两个类有共同的属性,我们将其提取到超类中,否则提取到接口中?

情况1:我有2个单独的类,有1个相同的命名方法,比如calculateCost()。-> 接口

情况2:我有2个单独的类和1个相同的命名方法,比如calculateCost(),我们有id作为字符串。-> 超类

我们如何决定做什么?


qq_花开花谢_0
浏览 268回答 2
2回答

BIG阳

尽管这主要是意见,但您应该记住一件事: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% 确定没有父类,并且永远不会有一个(可能提供(或继承自身))实现或该方法签名?然后是自由选择。另一方面,如果您选择默认方法,并且有人决定添加父类,则可能会导致一些压力调试。

扬帆大鱼

至于“经验法则”,我通常会问自己:抽象之间的关系是...“表现得像”的关系?-> 界面“是”关系?-> 超类以这些术语思考使代码库更易于理解,更直观地导航、阅读和维护。另请记住,您只能从一个超类继承。继承是一种创建高度耦合关系的强契约,因此它应该只在情况需要时使用(在我看来,当概念模型很好地适合“是一种”关系时)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java