Переопределить функцию без расширения класса
Предположим, что у меня есть класс A:
public class A {
public A(){....}
public void method1() {...}
};
И экземпляр этого класса:
A anA = new A();
Есть ли способ переопределить method1()
только для anA
?
Этот вопрос возникает, когда я пишу небольшую программу рисования, в которой я должен несколько раз расширять класс JPanel
, чтобы внести незначительные изменения в разные панели с немного разными характеристиками.
Ответы
Ответ 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() { ... }
};