2016-06-15 125 views
-1

我創建了一個Abstract類,現在將兩個不同類的代碼合併到它中。這兩個代碼都是相似的,但只有一行差異。如何使用相似的部分創建抽象方法,但對於具有額外代碼行的類有區別?具有兩種幾乎相同的方法的Java抽象類

例如:

public void exampleOneMethod(int number) { 
    ***userChoice = choice - 2;*** 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

public void exampleTwoMethod(int number) { 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

public void abstractMethod(int number) { 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

如何把userChoice =選擇 - 2;只有在example1擴展抽象類時,才能進入抽象類?

+1

你不知道。相反,重新設計您的類層次結構,以便example1在不訴諸黑客的情況下獲得正確的行爲。您可能還想使用接口。 –

回答

2

如何嘗試使用interface來代替?

public interface newInterface { 
    default void exampleTwoMethod(int number) { 
     while (userChoice.getNumber(number) == 0) { 
      number-- 
     } 
     option = false; 
    } 

    default void exampleOneMethod(int number) { 
     userChoice = choice - 2; 
     while (userChoice.getNumber(number) == 0) { 
      number-- 
     } 
     option = false; 
     } 
    } 
} 

當你想實現這個接口:

例如一個:

public class exampleOneClass implements newInterface { 
    public void exampleOneMethod(int number) { 
     newInterface.super.exampleOneMethod(number) 
    } 
} 

例如兩個:

public class exampleTwoClass implements newInterface { 
    public void exampleTwoMethod(int number) { 
     newInterface.super.exampleTwoMethod(number) 
    } 
} 

這是一個有點尷尬的做正如蒂姆在評論中所說的那樣,你可能需要考慮重建你的班級層次結構。

有關默認在Java中的方法的詳細信息,請參閱此鏈接。 https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

+0

如果我被告知不要使用Interfaces進行這個程序,這將是我的最佳答案。它幫助我找到了一個我以前問的問題。只需將該方法從抽象類中移出並使用getter來獲取我需要的變量即可。 –

1

您需要將它擴展爲兩個單獨的其他類,一個與另一個,另一個沒有。 extend只用於共享通用代碼,如果它不是通用代碼,那麼它不是適合繼承的實現,這是爲什麼composition is generally favored over inheritance

要麼將​​額外的操作放到抽象方法中,並在那裏執行,將類延長兩次,並將該方法留空或僅由兩個單獨的擴展類實現exampleOneMethod。或者,重新設計,使其適合繼承或重新設計,使其使用組合。

相關問題