如何使一个类正确地实现一个接口



我试图使一个类实现正确的接口,但似乎已经撞上了砖墙。我不确定我已经写的代码是否正确,但这是我理解如何处理任务的唯一途径。我已经得到了这个信息的接口:

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

该应用程序显示钢琴键,允许用户点击它们,并保存它们被点击的顺序和特定声音的音符的中间码。然后,当用户点击播放时,它会按照音符保存的顺序回忆曲调。当用户点击音符时,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`. 

我不知道该从这里开始,任何帮助都会很感激。如果需要进一步的信息,我会尽我所能澄清我所提出的任何观点。

提前感谢:)

虽然您已经创建了具有正确名称的方法,但您还需要具有正确的参数和返回类型。在这个例子中你需要修改:

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
        } 
    }
 }

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

嗯,

你的接口定义了方法:

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

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

最新更新