2011-12-03 60 views
1

我试图让一个类正确地实现一个接口,但似乎碰到了一堵砖墙。我不确定我所写的代码是否正确,但这是我理解如何处理任务的唯一方式。我一直在给定一个接口与这样的信息:如何让一个类正确地实现一个接口?

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

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

+0

是的,在网上看后,我发现我不能这样做,但我不知道如何正确地做这个类。我不希望得到答案,只是向正确的方向去暗示:)谢谢你的答复。 – user1079168

+0

我不太了解问题领域(即我对钢琴和笔记一无所知)。但是我猜想Notes集合需要失去对k键的依赖,所以你可以从它中检索而不需要传递它。例如,如果Notes是一个列表,请将当前音符的索引保存在一个整数变量中(在该类中),并在获取下一个音符时将其提前)。我也假设你不能改变界面。这意味着你必须改变你的实现的内部。 – Gigi

0

好,

您的接口定义的方法:

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

所以,

类中是否有确切定义,这与相同的返回类型和参数手段来实施它们。所以你可以在接口声明或类实现中改变它们。

1

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

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

删除整数参数。

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

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 
     } 
    } 
} 
相关问题