为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_花开花谢_0 2022-05-21 13:35:36
当识别不同类中的相同代码时,我们如何决定是将其提取到接口中还是超类中?由于接口不能保存任何属性,说起来很简单(“经验法则”):如果两个类有共同的属性,我们将其提取到超类中,否则提取到接口中?情况1:我有2个单独的类,有1个相同的命名方法,比如calculateCost()。-> 接口情况2:我有2个单独的类和1个相同的命名方法,比如calculateCost(),我们有id作为字符串。-> 超类我们如何决定做什么?
查看完整描述

2 回答

?
BIG阳

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% 确定没有父类,并且永远不会有一个(可能提供(或继承自身))实现或该方法签名?然后是自由选择。


另一方面,如果您选择默认方法,并且有人决定添加父类,则可能会导致一些压力调试。


查看完整回答
反对 回复 2022-05-21
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

至于“经验法则”,我通常会问自己:抽象之间的关系是...

  • “表现得像”的关系?-> 界面

  • “是”关系?-> 超类

以这些术语思考使代码库更易于理解,更直观地导航、阅读和维护。

另请记住,您只能从一个超类继承。继承是一种创建高度耦合关系的强契约,因此它应该只在情况需要时使用(在我看来,当概念模型很好地适合“是一种”关系时)。


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 260 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信