【问题标题】:Java: Implementation of Interfaces and abstract classesJava:接口和抽象类的实现
【发布时间】:2014-02-05 12:29:43
【问题描述】:

我正在尝试构建一个程序,当它们被排序时,我有一个 int 数组的可视化表示。将有两种不同的搜索算法可供选择。所有功能都分为类、接口和抽象类。我的主要问题是将数据从一件事转移到另一件事。

我的主类实现了基本的窗口功能。绘制窗口,几个按钮选择搜索算法,提供一个输入数组的文本字段,并在其中心显示数组的条形图可视化。 在扩展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();

然后我有实现Sorter 的抽象类CountingSort 和扩展CountingSort 的类CountingBubbleSort
这一切都让我很困惑。
在我的主课中,我听一个按钮来传递 TextField 的内容并开始排序。 我需要做什么才能将 int 数组通过CountingSort 转换为CountingBubbleSort? 我已经实现了CountingBubbleSort

让我知道我需要提供哪些额外信息。

【问题讨论】:

  • CountingBubbleSort#setNumbers ?
  • 不确定我是否理解,但是,你为什么不直接创建一个CountingBubbleSort 的实例?然后为该实例调用setNumbers(...)(以及所有必需的方法)。
  • 应该只是创建一个 CountingBubbleSort 对象并调用 setNumbers() 方法。抽象类 CountingSort 的想法是为排序功能提供一个标准接口,允许您拥有从该抽象类派生的几种不同类型的排序对象。多态性允许您将所有各种派生类型视为一个 CountingSort 对象,并且每个派生类型都将执行自己特定的排序实现。
  • 如何以及在哪里执行此操作?很抱歉,这是我使用接口和抽象类的第一个任务。
  • 看看一些相关链接,例如这个stackoverflow.com/questions/11389137/…

标签: java arrays interface abstract-class


【解决方案1】:

如果您向您的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();
    }
}

【讨论】:

  • 好的。我已经做到了。在CountingBubbleSort 中,我将 `public void sort(int[] numbers){...} 放在您建议的代码下。但是如何从我的主类中调用 BubbleSort?
  • 更新了我的答案。我建议在继续编写代码之前更深入地了解 Java 继承
猜你喜欢
  • 2012-01-20
  • 2020-10-20
  • 2011-11-20
  • 2014-08-18
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 2012-07-17
  • 2011-10-18
相关资源
最近更新 更多