如何使类正确实现接口?

时间:2011-12-03 19:28:41

标签: java class interface override abstract

我正在尝试使一个类正确实现一个接口,但似乎已经碰到了一堵砖墙。我不确定我编写的代码是否正确,但这是我理解如何处理任务的唯一方法。我收到了这个信息的界面:

package mvcchords;

public interface NoteStore {
    int getNextNote();
    boolean hasNextNote();
    void noteAdded(int midicode);
    void start(int sortOrder);
}

应用程序显示钢琴键,允许用户点击它们,并保存单击它们的顺序和特定声音的音符的midicode。然后,当用户点击播放时,它会按照保存笔记的顺序重新调出曲调。当用户点击注释时,noteAdded被调用。 hasNextNote用于检查它是否是已保存笔记的结尾。 getNextNote用于从数组列表中获取下一个注释,并在用户单击播放按钮时调用start。我被告知整数sortOrder与这部分任务无关。有人告诉我,当点击播放按钮时,它应该调用start方法然后重复调用getNextNote方法,直到检索完所有笔记。

下面是我为一个类实现此接口而编写的代码;

import java.util.*;
import mvcchords.*;

public class MyNoteStore implements NoteStore {

public ArrayList<Integer> Notes;

public void noteAdded(int midicode) {
    Notes.add(midicode);
}

public boolean hasNextNote(int k) {
    if(Notes.get(k) != null)
        return true;
    else
        return false;
}

public int getNextNote(int k) {

        if(hasNextNote(Notes.get(k)) == true)
            return Notes.get(k);
        else
            return 0;
    }

public void start(int sortOrder) {

    for(int k = 0; k < Notes.size(); k++){
    hasNextNote(k);
    getNextNote(k);
    }
  }
}

此代码给我一个错误说

MyNoteStore is not abstract and does not override abstract method `hasNextNote()` in `mvcchords.NoteStore`. 

我不知道从哪里开始,任何帮助将不胜感激。如果需要进一步的信息,那么我将尽力澄清我所提出的任何观点。

提前谢谢你:)

3 个答案:

答案 0 :(得分:1)

虽然您已经使用正确的名称创建了方法,但您还需要拥有正确的参数和返回类型。所以在这种情况下你需要改变:

int getNextNote(int i);
boolean hasNextNote(int k);

删除整数参数。

基本上你需要跟踪到目前为止在课堂上播放的音符,这样你就不需要一直传递一个整数。您可以使用Iterator,也可以只存储一个整数来跟踪最后播放的索引。下面的方法使用迭代器,也许你应该尝试自己创建一个整数。

    public class MyNoteStore implements NoteStore {

    ArrayList<Integer> notes = new ArrayList<Integer>();
    Iterator<Integer> playbackIter;    

    public void noteAdded(int midicode) {
        notes.add(midicode);
    }

    public boolean hasNextNote() {
        if (playbackIter != null) {
            return playbackIter.hasNext();
        }
        else {
            return false;
        }
    }

    public int getNextNote() {
        if (playBackIter != null) {
            return playBackIter.next();
        }
        else {
            return -1;
        }

    }

    public void start(int sortOrder) {
        playBackIter = notes.iterator();
        while(hasNextNote()) {
            int note = getNextNote();
            //play note
        } 
    }
 }

答案 1 :(得分:0)

方法中的参数在您的实现和界面中的声明之间是不同的。

答案 2 :(得分:0)

那么,

您的界面定义了方法:

    int getNextNote();
    boolean hasNextNote();
    void noteAdded(int midicode);
    void start(int sortOrder);

所以,

您的类必须使用确切的定义来实现它们,这意味着具有相同的返回类型AND参数。因此,您可以在接口声明或类实现中更改它们。