2014-01-16 219 views
0

我想構建一個程序,當我們有一個int數組的視覺表示,而他們得到排序。將會有兩種不同的搜索算法可供選擇。所有的功能被分成類,接口和抽象類。我的主要問題是從一件事到另一件事獲取數據。Java:接口和抽象類的實現

我的主類實現了基本的窗口功能。繪製窗口,選擇搜索算法的幾個按鈕,提供一個文本字段來輸入一個數組,並在其中央顯示一個數組的條形圖可視化。 在延伸JComponent的類中繪製條形圖。這也是我將數字字符串轉換爲int數組的地方。我已經可以繪製圖形,更改數組並將其繪製。

現在我有一個名爲Sorter的接口,它提供了以下方法。

public void setUpTo(int i); // to limit the number of swaps during the search 
public void setNumbers(int[] numbers); 
public void sort(); 
public String getName(); 
public int getSwaps(); 

然後,我有抽象類CountingSort實現Sorter和類CountingBubbleSort延伸CountingSort
這對我來說都很困惑。
在我的主類中,我聽一個按鈕傳遞TextField的內容並開始排序。 我需要做些什麼來通過CountingSort獲得int數組到CountingBubbleSort? 我已經實施CountingBubbleSort

讓我知道我需要提供哪些附加信息。

+0

'CountingBubbleSort#setNumbers'? – nachokk

+0

不知道我是否理解,但是,爲什麼不創建'CountingBubbleSort'的實例?然後調用該實例的'setNumbers(...)'(以及所有必需的方法)。 – Christian

+0

應該只是創建一個CountingBubbleSort對象並調用setNumbers()方法。抽象類CountingSort的想法是爲排序功能提供一個標準接口,允許您從該抽象類派生幾種不同類型的排序對象。多態性允許您將所有各種派生類型視爲CountingSort對象,並且每個派生類型都將執行它們自己的特定排序實現。 –

回答

2

如果在Sorter接口(getNumbers())中添加另一種方法,它將保證所有Sorter實現將具有一個到內部int數組的getter和setter。

interface Sorter { 
    public int[] getNumbers(); 
    public void setNumbers(int [] numbers); 
    //... other methods.... 
} 

然後,如果你實現它像這樣在你的抽象CountingSort類,那麼你就可以使用這些方法,而不需要實現它們的所有子類。

abstract class CountingSort implements Sorter{ 
    private int [] mNumbers; 

    @Override 
    public int[] getNumbers() { 
     return mNumbers; 
    } 

    @Override 
    public void setNumbers(int[] numbers) { 
     mNumbers = numbers; 
    } 
} 

然後你可以隨時訪問具體實現中的數字,如果你有它們的設置。我會建議在CountingBubbleSort中使用一個構造函數,該構造函數接受int數組(或隨機生成它,但是您想創建它)。此構造方法也許可以上升到抽象類:

class CountingBubbleSort extends CountingSort{ 
    public CountingBubbleSort(int [] numbers){ 
     setNumbers(numbers); 
    } 

    public void someOtherMethod(){ 
     int [] numbers = getNumbers(); 
    } 
} 

在你的主類,你可以用什麼繼承所提供的,是這樣的:

class MainClass { 
    private Sorter mSorter; 

    public void doSort(){ 
     //Create sorter objects 
     if(you want CountingBubbleSort){ 
      mSorter = new CountingBubbleSort(); 
     }else{ 
      mSorter = new BubbleSort(); 
     } 
     //get the numbers 
     int [] numbers = mSorter.getNumbers(); 

     // do the sorting 
     mSorter.sort(); 
    } 
} 
+0

好的。我已經做到了。在'CountingBubbleSort'中,我把'public void sort(int [] numbers){...}放在你的代碼中。但是我如何從我的主類調用BubbleSort? – sebastian

+0

更新了我的答案。我建議在繼續執行代碼之前更深入地查看java繼承 –