Использование композиции - PullRequest
       1

Использование композиции

0 голосов
/ 28 сентября 2011

Я пытаюсь использовать пользовательский класс для переопределения метода в его суперклассе с использованием композиции. Ниже код, который я пытаюсь, в классе "Bar", какой объект вызывает метод doSomethingElse ()? Это не мой код и связан с вопросом - Использование композиции поверх наследования при переопределении

Все экземпляры происходят в дочернем классе.

class Child extents Parent(){

public Child(){
   super();
   addButtons():
}
 addButtons(){
   <custom code here>
}

}


class Parent(){
 addButtons(){
   add(button1);
}
}

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 ]

1 голос
/ 28 сентября 2011

вы близки, просто сделайте это с классом Бар

class Bar extends Foo {
   // note Bar is still of type SomeMethods because it extends a class of that type.
   public void doSomething() {
      super.doSomething();
      //add more code here if you want to do some more stuff, note you don't need to define this function if you don't need to do anything else.
   }
   public void doSomethingElse() {
      //don't call super, and do whatever you like
   }
}
0 голосов
/ 28 сентября 2011

Если исходной целью было переопределить doSomethingElse, то при использовании вместо этого Composition в Bar вы делегировали бы все другие методы (в данном случае doSomething) для Foo и добавили свое переопределенное поведение в Bar.doSomethingElse ()

Так что это может быть что-то вроде:

public void doSomethingElse() {
    .... // custom stuff
    foo.doSomethingElse(); // this is the equivalent of an inheritance super call, so it's optional
    .... // other custom stuff
}

Также (независимо от исходного вопроса, но я не могу не упомянуть его), чтобы создать лучший код, вы должны внедрить зависимость Foo, а не связывать ее с Bar.

class Bar implements SomeMethod {
   private final SomeMethod foo;

   public Bar(SomeMethod foo) {
     this.foo = foo;  
   }

   public void doSomething() { foo.doSomething(); }
   public void doSomethingElse() { // do something else! }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...