我试图使一个类实现正确的接口,但似乎已经撞上了砖墙。我不确定我已经写的代码是否正确,但这是我理解如何处理任务的唯一途径。我已经得到了这个信息的接口:
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);
你的类必须用完全相同的定义来实现它们,这意味着使用相同的返回类型和参数。因此,您可以在接口声明或类实现中更改它们。