【问题标题】:Using composition over inheritance when overriding覆盖时使用组合而不是继承
【发布时间】:2011-09-26 18:46:21
【问题描述】:

如果我有一个类,我想通过重写一个类来自定义它的方法,我唯一能做到的就是使用继承(子类化和重写方法)?是否可以以某种方式使用组合来实现相同的目标?

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    是的,您可以使用委托。在下面的示例中,Bar 不是从 Foo 派生的,而是包含一个 Foo 并在它选择的地方委托给它。

    interface SomeMethods {
      void doSomething();
      void doSomethingElse();
    }
    
    class Foo implements SomeMethod {
      public void doSomething() { // implementation }
      public void doSomethingElse() { // implementation }
    }
    
    class Bar implements SomeMethod {
       private final Foo foo = new Foo();
    
       public void doSomething() { foo.doSomething(); }
       public void doSomethingElse() { // do something else! }
    }
    

    【讨论】:

    • 好的,所以超类必须实现与子类相同的接口?
    【解决方案2】:

    使用组合而不是继承是一种设计选择。

    您的类要么在设计时考虑到继承(即它提供了非最终的公共和受保护方法,旨在被子类覆盖),要么在设计时考虑到组合或委托(通过使用策略模式, 例如)。

    如果该类根本不是为定制而设计的,您也许可以使用继承来定制它,但不能使用组合/委托机制。

    【讨论】:

      【解决方案3】:

      当然。您可以使用以下模式。

      方法method的简单覆盖

      模板方法模式

      class Base {
          public void foo() {
              // do something
              bar();
              // do something
          }
          protected abstract void bar();
      }
      
      class Child {
          protected void bar() {
              // do something.
          }
      }
      

      代表团

      class Base {
          private Runnable r;
          protected Base(Runnable r) {
              this.r = r;
          }
      
          public void foo() {
              r.run();
          }
      }
      
      class Child extends Base {
          Child() {
              super(new Runnable() { /* implementation */})
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多