首页 > 解决方案 > 如何将父类属性添加到子类

问题描述

我有一个名为Set代表一组网球比赛的父类。

public class Set {
  private String set1;
  private String set2;
  private String set3;
  //private Object[] match;

  public Set() {
    setSet1(set1);
    setSet2(set2);
    setSet3(set3);
  }

  public void setSet1(String set1) {
    this.set1 = set1;
  }

  public String getSet1() {
    return set1;
  }

  public void setSet2(String set2) {
    this.set2 = set2;
  }

  public String getSet2() {
    return set2;
  }

  public void setSet3(String set3) {
    this.set3 = set3;
  }

  public String getSet3() {
    return set3;
  }


  public String toString(){
    return String.format("set1: %s, set2: %s, set3: %s", set1, set2, set3);
  }


}

Set和一个名为的子类SingleSet,我尝试将集合添加到一个名为 `game.

public class SingleSet extends Set{
  private Object homePlayer;
  private Object awayPlayer;

  private String[] game;

  public SingleSet(Object homePlayer, Object awayPlayer){
    super();

    game = new String[3];

    game[0] = super.getSet1();
    game[1] = super.getSet2();
    game[2] = super.getSet3();

    setHomePlayer(homePlayer);
    setAwayPlayer(awayPlayer);
  }

  public void setHomePlayer(Object homePlayer) {
    this.homePlayer = homePlayer;
  }

  public Object getHomePlayer() {
    return homePlayer;
  }

  public void setAwayPlayer(Object awayPlayer) {
    this.awayPlayer = awayPlayer;
  }

  public Object getAwayPlayer() {
    return awayPlayer;
  }

  public void setGame(String[] game) {
    this.game = game;
  }

  public String[] getGame() {
    return game;
  }

  public String toString(){
    return String.format("Player: %s Vs. Player: %s, Single set game: %s, %s, %s", homePlayer, awayPlayer, game[0], game[1], game[2]);
  }
}

这是我试图将Set我父母类中的 s 添加到我的子类中的地方(这是用于 FXML,所以代码在我的控制器中):

 public void submit() {
    SingleSet game1 = new SingleSet(homePlayer1Dropdown.getValue(), awayPlayer1Dropdown.getValue());
    game1.setSet1(set1Box1.getText());
    game1.setSet2(set1Box2.getText());
    game1.setSet3(set1Box3.getText());

    System.out.println(game1);
 }

当我打印结果时,我的数组值为空。我尝试单独打印它们并且效果很好,所以我知道set1Box.getText()它工作正常。

标签: javaoop

解决方案


  1. 您没有在 Set 的默认构造函数中设置任何内容
  2. 真的应该为您的班级找到一个更好的名称,因为“Set”与集合 Set 混淆。
  3. 为你的两个类使用不可变来避免麻烦 - 删除所有设置器并在构造函数中初始化。
  4. 我不擅长网球得分规则,但据我所知,“一局”有许多“比赛”,而“比赛”由多局组成。这种关系“Set <- SingleSet”的逻辑是什么?如果您以这种方式更改层次结构会怎样(在伪代码中,为简洁起见,将跳过大多数方法主体):
class Player{
  private String name;
  public Player(String name);
}

class Match{
  private Player homePlayer;
  private Player awayPlayer;
  private List<Set> sets;
  public Match(Player homePlayer, Public awayPlayer);
  public List<Set> getSets(){
    if(sets == null){
      sets = new ArrayList<>();
    }
    return sets;
  }
}

class Set{
  public Set(Game... games);
}

class Game{
  // game score details
  public Game(int scoreHomePlayer, int scoreAwayPlayer);
}

所以在你的控制器中,你可以像这样使用它:

Match match = new Match(new Player("Williams"), new Player("Johnson"))
match.getSets().add(new Set(
   new Game(6, 1),
   new Game(4, 6),
   new Game(7, 0)
   // etc.
))
  1. 您可以使用Builder Pattern进一步重构 #4 层次结构并保留所有这些“new ()”构造函数调用,大致如下:
Match match = new MatchBuilder("Williams","Johnson").addSet()
  .addGame(6,1).addGame(4,6).addGame(7,0)
  .build()

推荐阅读