2011-08-27 65 views
3

我目前工作的一個Java ME應用程序,我有這樣的代碼:如何只覆蓋具體方法

svgForm.setSVGEventListener(new SVGEventListener(){ 
       public void keyPressed(int i) { 
        System.out.println("Val"+i); 
       } 
       public void keyReleased(int i) { 
        System.out.println("Val"+i); 
       } 
       public void pointerPressed(int i, int i1) { 
        return; 
       } 
       public void pointerReleased(int i, int i1) { 
        return; 
       } 
       public void hideNotify() { 
        return; 
       } 
       public void showNotify() { 
        return; 
       } 
       public void sizeChanged(int i, int i1) { 
        return; 
       } 
}); 

然而,就像你看到的,我並不需要重寫所有的方法。更糟的是,通過壓倒他們我失去了功能。有沒有辦法保持原有的方法,只能覆蓋某些方法?

+1

實現接口時,必須覆蓋該接口聲明的所有方法。界面沒有功能,所以你怎麼會失去功能?如果您從實施這些方法的類中擴展,則可以省略它們。 –

回答

7

你沒有選擇,你需要實現它們。然而,一個常見的模式是有一個基類,提供在接口中的方法無操作的實現,然後擴展該基類,當你需要做一些有用的東西:

public class BaseSVGEventListener implements BaseSVGEventListener { 
      public void keyPressed(int i) {} 
      public void keyReleased(int i) {} 
      public void pointerPressed(int i, int i1) {} 
      public void pointerReleased(int i, int i1) {} 
      public void hideNotify() {} 
      public void showNotify() {} 
      public void sizeChanged(int i, int i1) {} 
} 

然後:

svgForm.setSVGEventListener(new BaseSVGEventListener(){ 
      public void keyPressed(int i) { 
       System.out.println("Val"+i); 
      } 
      public void keyReleased(int i) { 
       System.out.println("Val"+i); 
      } 
}); 

有在Java AWT/Swing的API的許多這樣的例子,例如FocusListenerFocusAdapter

接收鍵盤FOC的抽象適配器類我們的事件。這個類中的方法是空的。這個類作爲創建偵聽器對象的便利而存在。

擴展此類創建FocusEvent偵聽器並重寫所需事件的方法。 (如果您實現FocusListener界面,你必須定義所有的在它的方法。此抽象類定義了所有這些空方法,所以你可以只需要針對所關心的事件重寫方法。)

Java API將這些「適配器」稱爲「適配器」,儘管這是一個相當可疑的用法。 「適配器模式」應該用於使一種類型適應另一種類型,這不是這些API類所做的。

+0

您可以在javax.swing中廣泛查找此模式。例如,有MouseListener接口和MouseAdapter實現,可以爲您節省大量輸入。 – zedoo

+0

對於一個非常詳盡的解釋,你擊敗了我。 – prasopes

+0

另外,關於「適配器」術語的好處。 – prasopes

0

如果要擴展一個類你可以省略任何方法,使他們能夠通過超類來處理。或者,您可以在實施中致電​​。

從快速谷歌然而,在我看來,SVGEventListener是一個接口不是類,所以是的,你將必須實現所有方法。你不應該失去任何功能,但因爲interface沒有實現代碼 - 沒有任何損失。

0

1)不要使用匿名類。擴展你自己,你可能只會覆蓋你所需要的。

2)失去功能,僅僅是因爲你沒有在覆蓋的方法正文中使用super.nameOfMethod()。

3)學習Java的最基礎的。在開始使用Java之前,可能需要花一兩個星期閱讀Java書。在微不足道的東西上發佈問題。