2011-07-14 105 views
0

我有Dad類別Son的子類。我想創建一個Dad的子類和Son的子類,它覆蓋Dad的一個方法。如何在不重複代碼的情況下劃分子類

沒有重複代碼,這樣做的最佳方式是什麼?我無法修改DadSon

鑑於...

public class Dad { 

public void doSomething() {} 

} 

public class Son extends Dad { 

} 

...我想創建...

public class DadSubclass extends Dad { 

@Overrides 
public void doSomething() {   
    // My code 
} 

} 

public class SonSubclass extends Son { 

@Overrides 
public void doSomething() { 
    // My code 
} 

} 

...不重複// My code

顯而易見的解決方案是創建一個輔助類併爲它們調用它,但是如果我想調用受保護的方法,這是有問題的,而且我不允許使用相同的包創建子類。

有沒有更好的解決方案?

+1

我會重新考慮你的類層次結構來代替。如果你重複這樣的代碼,這意味着你如何定義它有什麼問題。 – vanza

+0

這實際上取決於具體情況......您需要訪問哪些成員,子類中有多少代碼是相同的。也許看模板方法模式 - 取決於你的情況。 –

+0

@vanza不幸的是原來的類是現有庫的一部分。特別是Android SDK。 – hpique

回答

3

創建一個通用幫助類並調用它。

+0

如果我想在doSomething()中調用受保護的方法,並且我不允許使用相同的包創建子類,它會變得有點棘手。 – hpique

+0

@hgpc - 您不幸必須將保護函數的結果傳遞給實用程序類,我不認爲有另一種方法 – dfb

+0

您可以傳遞一個「this」的實例,該實例具有受保護方法的代理方法。 – JustinKSU

3

假設你的代碼沒有訪問成員變量,我只是把這段代碼放在一個靜態工具類中。如果情況並非如此,您仍然可以通過傳入一個共同的超類 - 「爸爸」public static void mycode(Dad d)。如果你需要子類本身的特定變量,我會重新考慮你的類結構。

+0

@vanza不幸的是原始類是現有庫(Android)的一部分,我無法改變它們。 – hpique

0

你真正想要的這裏是這樣的:

class DadSonSubclass extends Dad, Son { 
    public void doSomething() { 
     //mycode 
    } 
} 

這是多重繼承,這是不支持Java。所以你唯一的選擇就是創建一個輔助/實用程序類,這是完全可以接受的。如果您需要調用受保護的方法,只需將父對象傳遞給助手類並創建公用回調方法即可訪問此信息。

0

也許更好,也許不是,這取決於你的觀點,但它當然可以做到。把你的代碼放到一個輔助類,並使用一個回調來給它需要保護的方法,該助手訪問:

interface Callback { 
    void foo(); 
    void bar(); 
    void one(); 
    void two(); 
} 

class Helper { 
    static void helpMe(Callback callback) { 
     // My code 
    } 
} 

class DadSubclass extends Dad { 
    @Override 
    public void doSomething() { 
     Helper.helpMe(new Callback() { 
      public void foo() { 
       DadSubclass.this.foo(); 
      } 

      public void bar() { 
       DadSubclass.this.bar(); 
      } 

      public void one() { 
       throw new UnsupportedOperationException("one() doesn't exist in Dad"); 
      } 

      public void two() { 
       throw new UnsupportedOperationException("two() doesn't exist in Dad"); 
      } 
     }); 
    } 
} 

class SonSubclass extends Son { 
    @Override 
    public void doSomething() { 
     Helper.helpMe(new Callback() { 
      public void foo() { 
       SonSubclass.this.foo(); 
      } 

      public void bar() { 
       SonSubclass.this.bar(); 
      } 

      public void one() { 
       SonSubclass.this.one(); 
      } 

      public void two() { 
       SonSubclass.this.two(); 
      } 
     }); 
    } 
} 
相關問題