【问题标题】:Is it right to use extend and implement in the same class?在同一个类中使用扩展和实现是否正确?
【发布时间】:2020-07-27 13:24:48
【问题描述】:
interface A {
    void someMethod();
}

class B implements A {
    void someMethod() {
        //do something
    }
}

class C extends B implements A {
    void someMethod() {
        super.someMethod();
        //do something
    }
}

我在我的一个代码中使用了上述设计。它工作正常。 我在这里的全部目的是使用 B 类的默认实现并在 C 类中做一些额外的事情。这是使用该实现的正确方法吗?有没有更好的设计模式可供参考?

因为如果我将我的 C 类定义如下,仍然一切正常。但这忽略了使用实现的全部目的(强制类 C 实现接口 A 的方法)。

class C extends B implements A {}

【问题讨论】:

    标签: java design-patterns polymorphism implementation extends


    【解决方案1】:

    是的,在同一个类上扩展和实现都很好。 事实上,如果你看看 HashMap(和许多其他人),它就是这样做的:

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 
    

    【讨论】:

    【解决方案2】:

    它仍然可以正常工作,因为当您扩展带有 someMethod 实现的 B 时,从而履行合同。

    【讨论】:

      【解决方案3】:

      请理解 class C extends B implements A 完全等同于 class C extends B,除了快速文档目的。

      尝试从class C 中删除someMethod() 的定义,看看您的代码是否可以编译。它会编译。原因是,当您创建C 扩展B 时,C 默认获取B 中定义的所有方法,其中还包括someMethod() 的实现。违背了明确合同的全部目的。

      如果您真的想强制C 给出someMethod() 的定义,请尝试以下代码:

      interface A {
          void someMethod();
      }
      
      abstract class B implements A {
          protected void someUtilMethod() {
              //do common/default defination
          }
      }
      
      class C extends B {
          void someMethod() {
              someUtilMethod();
              //do extra something
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-01-25
        • 2014-04-21
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 2021-02-03
        • 1970-01-01
        • 2011-07-17
        • 2018-05-25
        相关资源
        最近更新 更多