假設我有一個A類的函數:覆蓋無需擴展類
public class A {
public A(){....}
public void method1() {...}
};
而那類的一個實例:
A anA = new A();
有什麼辦法來覆蓋method1()
只爲anA
? 當我編寫一個小型繪畫程序時,出現了這個問題,我不得不多次延長JPanel
這個課程,只是對具有稍微不同特徵的不同面板進行微小更改。
假設我有一個A類的函數:覆蓋無需擴展類
public class A {
public A(){....}
public void method1() {...}
};
而那類的一個實例:
A anA = new A();
有什麼辦法來覆蓋method1()
只爲anA
? 當我編寫一個小型繪畫程序時,出現了這個問題,我不得不多次延長JPanel
這個課程,只是對具有稍微不同特徵的不同面板進行微小更改。
你可以做到以下幾點:
A anA = new A() {
public void method1() {
...
}
};
這是一樣的:
private static class myA extends A {
public void method1() {
...
}
}
A anA = new myA();
只有所不同的是在這種情況下myA
可重複使用。這對於匿名類是不可能的。
您可以即時創建一個新的匿名類,只要你使用的是類A
的無參數的構造函數:
A anA = new A() {
@Override
public void method1() {
...
}
};
請注意,你想要做什麼是非常接近所謂的lambda,它應該在Java SE的下一個版本8中出現。
我喜歡用委託或「策略模式」來做這種事情。
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() { ... }
};
確實,但從技術上講,這是創建一個匿名類,擴展類A. – 2012-08-13 06:37:39
@StephenC的確。我已經更新了答案。感謝您指出。 – jensgram 2012-08-13 06:38:09
@jensgram這可能會很晚但非常感謝。 – 2013-03-16 23:25:02