2014-01-16 213 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继承 –