2012-08-13 174 views
23

假設我有一個A類的函數:覆蓋無需擴展類

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

而那類的一個實例:

A anA = new A(); 

有什麼辦法來覆蓋method1()只爲anA? 當我編寫一個小型繪畫程序時,出現了這個問題,我不得不多次延長JPanel這個課程,只是對具有稍微不同特徵的不同面板進行微小更改。

回答

46

你可以做到以下幾點:

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

這是一樣的:

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

A anA = new myA(); 

只有所不同的是在這種情況下myA可重複使用。這對於匿名類是不可能的。

+14

確實,但從技術上講,這是創建一個匿名類,擴展類A. – 2012-08-13 06:37:39

+0

@StephenC的確。我已經更新了答案。感謝您指出。 – jensgram 2012-08-13 06:38:09

+0

@jensgram這可能會很晚但非常感謝。 – 2013-03-16 23:25:02

13

您可以即時創建一個新的匿名類,只要你使用的是類A的無參數的構造函數:

A anA = new A() { 

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

請注意,你想要做什麼是非常接近所謂的lambda,它應該在Java SE的下一個版本8中出現。

2

我喜歡用委託或「策略模式」來做這種事情。

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() { ... } 
};