接口作为数据结构的一部分

时间:2014-11-03 23:11:38

标签: java interface

我正在尝试编写一些代码(新手java用户),我收到了一个错误。我有一种预感,它与我对AdvancedMatch的类定义有关,这是锦标赛中的一个匹配。它需要有两个馈线匹配,可以是AdvancedMatch或InitMatch,其中InitMatch没有馈线,AdvancedMatch也没有。为了达到这个目的,我使用了一个界面ITournament,它让我可以选择将ITournament放在AdvancedMatch的数据结构中。

public class AdvancedMatch implements ITournament {
  MatchData data;
  ITournament feeder1;
  ITournament feeder2;

  AdvancedMatch (MatchData data, ITournament feeder1, ITournament feeder2) {
    this.data = data;
    this.feeder1 = feeder1;
    this.feeder2 = feeder2;
  }
}


public class InitMatch implements ITournament {
  MatchData data;

  InitMatch (MatchData data) {
    this.data = data;
  }
}

interface ITournament {
  public Boolean allScoresValid();

  public Boolean highCapacityVenue(int ticketsSold);

  public Boolean winnerAlwaysAdvanced();

  public Boolean tWinnerContestant1() ;

}

稍后在代码中,我尝试在方法中调用feeder1.data,并且我不断收到数据无法解析或不是字段的错误。这让我感到困惑,因为显然数据是AdvancedMatch和InitMatch的一部分。

public Boolean winnerAlwaysAdvanced() {
    if (this.feeder1.tWinnerContestant1()) {
      this.data.dCompareContestants1(this.feeder1.data);
    }
    else 
      return this.data.dCompareContestants2(this.feeder1.data);
    }
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您的feeder1被声明为ITournament ITournament feeder1; - 它未被声明为具有InitMatch属性的data

当使用接口声明变量时,它只能访问 interface 中声明的内容,而不管底层的类实例。

由于InitMatch和AdvancedMatch都有 data 元素,因此您可以在接口定义中包含该元素。然而,最佳实践需要“吸气剂”,而不是直接访问。

interface ITournament {
  public Boolean allScoresValid();
  public Boolean highCapacityVenue(int ticketsSold);
  public Boolean winnerAlwaysAdvanced();
  public Boolean tWinnerContestant1();
  public MatchData getMatchData();
}

答案 1 :(得分:0)

对于要实现接口的类,它必须实现接口的所有方法

您的任何一个类都没有实现ITournament接口的所有方法。