Подтвердить что ты не робот

Переопределить функцию без расширения класса

Предположим, что у меня есть класс A:

public class A {
    public A(){....}
    public void method1() {...}
};

И экземпляр этого класса:

A anA = new A();

Есть ли способ переопределить method1() только для anA? Этот вопрос возникает, когда я пишу небольшую программу рисования, в которой я должен несколько раз расширять класс JPanel, чтобы внести незначительные изменения в разные панели с немного разными характеристиками.

4b9b3361

Ответ 1

Вы можете сделать следующее:

A anA = new A() {
    public void method1() {
        ...
    }
};

Это то же самое, что:

private static class myA extends A {
    public void method1() {
        ...
    }
}

A anA = new myA();

Только в том случае, если в этом случае myA можно повторно использовать. Это невозможно с анонимными классами.

Ответ 2

Вы можете создать новый анонимный класс "на лету", если вы используете конструктор no-arg вашего класса A:

A anA = new A() {

  @Override
  public void method1() {
    ...
  }
};

Обратите внимание, что то, что вы хотите сделать, очень близко к тому, что известно как лямбда, которое должно появиться в следующем выпуске 8 Java SE.

Ответ 3

Мне нравится делать это с делегатом или "шаблон стратегии".

public interface ADelegate {
   public void method1();
}

public class A {
    public A(){....}
    public ADelegate delegate;
    public final void method1() { delegate.method1(); }
};

A anA = new A();
anA.delegate = new ADelegate() {
   public void method1() { ... }
};