Использование композиции поверх наследования при переопределении - PullRequest
1 голос
/ 26 сентября 2011

Если у меня есть класс, который я хотел бы настроить, переопределив один, если его методы, единственное, что я могу сделать, это использовать наследование (метод подклассификации и переопределения)? Можно ли каким-то образом использовать композицию для достижения той же цели?

Ответы [ 3 ]

4 голосов
/ 26 сентября 2011

Да, вы можете использовать делегирование.Вместо Foo в приведенном ниже примере Bar содержит 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! }
}
3 голосов
/ 26 сентября 2011

Конечно.Можно использовать следующие шаблоны:

Простое переопределение метода метода

Шаблон шаблона шаблона

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 */})
    }
}
3 голосов
/ 26 сентября 2011

Использование композиции вместо наследования является выбором дизайна.

Либо ваш класс был разработан с учетом наследования (т. Е. Он предоставляет неконечные публичные и защищенные методы, предназначенные для переопределения подклассами), либо он был разработан с учетом композиции или делегирования (с использованиемшаблон стратегии, например).

Если класс вообще не предназначен для настройки, вы можете настроить его, используя наследование, но не используя механизм компоновки / делегирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...