【问题标题】:How can I make a class implement an interface correctly?如何让类正确实现接口?
【发布时间】:2011-12-03 19:28:40
【问题描述】:

我正在尝试让一个类正确实现一个接口,但似乎遇到了障碍。我不确定我已经编写的代码是否正确,但这是我理解如何处理任务的唯一方法。我已经获得了一个包含这些信息的界面:

package mvcchords;

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

应用程序显示允许用户单击它们的钢琴键,并保存它们被单击的顺序和特定声音的音符的 midicode。然后,当用户单击播放时,它会按照保存音符的顺序调用曲调。当用户单击注释时,会调用 noteAddedhasNextNote 用于检查是否是已保存笔记的结尾。 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`. 

我不知道从这里去哪里,如果有任何帮助,我将不胜感激。如果需要更多信息,我会尽力澄清我提出的任何观点。

提前谢谢你:)

【问题讨论】:

    标签: java class interface overriding abstract


    【解决方案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
            } 
        }
     }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,上网后发现不能这样做,但除此之外我不知道如何正确地上课。我不希望得到答案,只是对正确方向的提示:) 谢谢您的回复。
      • 我不太了解问题域(即我对钢琴和音符一无所知)。但是我猜想 Notes 集合需要失去对键 k 的依赖,因此您可以从中检索而无需传递它。例如,如果 Notes 是一个列表,则将当前音符的索引保存在一个整数变量中(在类中),并在获得下一个音符时将其推进)。我还假设您无法更改界面。这意味着您必须更改实现的内部结构。
      【解决方案3】:

      嗯,

      你的接口定义了方法:

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

      所以,

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

      【讨论】:

        猜你喜欢
        • 2018-07-20
        • 2022-01-23
        • 2016-06-10
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        相关资源
        最近更新 更多