我正在尝试使一个类正确实现一个接口,但似乎已经碰到了一堵砖墙。我不确定我编写的代码是否正确,但这是我理解如何处理任务的唯一方法。我收到了这个信息的界面:
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`.
我不知道从哪里开始,任何帮助将不胜感激。如果需要进一步的信息,那么我将尽力澄清我所提出的任何观点。
提前谢谢你:)
答案 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参数。因此,您可以在接口声明或类实现中更改它们。