为了好玩,我想用Java制作篮球模拟游戏。我想要一个简单的类“团队”,我希望有一个名为“player”的类团队的子类。我理解如何声明类和子类但我的问题是如何向某个团队声明一个玩家?
例如:
Team team1 = new Team();
Team team2 = new Team();
Player nameHere = new Player();
如何将其设置为球员名称在team1或team2等上的位置......
答案 0 :(得分:2)
您需要了解两个重要的软件设计原则:
- Inheritance (IS A relationship)
- Composition (HAS A relationship)
当您处理第一个概念时,您使用类和子类。但在这种情况下,您的子类与您的父类基本相同:它就像汽车和法拉利。法拉利 IS A 汽车(这种关系由OOP中的继承表示)。 然而,一辆汽车有一个风幕。风幕不是汽车,它是它的一部分(这种关系通过包含一个类作为另一个类的字段成员 - 组合来表示)。 现在,您了解这些关系,您需要问自己一个问题: IS 玩家 A 团队,或 HAS 团队 A 玩家?
在这种情况下,似乎很明显。您需要在List<Player>
课程中放置Team
。
答案 1 :(得分:1)
我认为您完全不了解Inherritance的含义。 超类的子类应该是超类的特例。
请查看http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html了解更多示例。
你想要的是一个有attrute
的班级团队List<Player> players;
如果你想编写任何面向对象的代码,我建议你阅读一下继承性。
答案 2 :(得分:1)
其他人提供了很好的解释,但让我补充一点。
许多缺乏经验的开发人员使用子类来保存代码。他们如此迷恋于他们在学校学到的继承,他们急于把所有东西都考虑到一些共同的基类,并将它分类为疯狂。
这是错误的方法。
如果一个类共享代码但是它们共享相同的行为,那么它应该是另一个类的子类。那么问问自己,一个玩家是否有与团队相同的行为?
可能不是。
例如,一个团队有一个时间表,一个反对者列表,一个所有者,一个城市,一个出勤人员,一个体育场等等。球员没有。因此Player
不应该是Team
的子类。但是,Team
有意义由其他人提到的List<Player>
组成。
但是现在让它变得更加复杂和有趣。
让我们考虑一下足球队。球队中的球员可以有进球,助攻和犯规。团队也可以拥有所有这些东西,团队对这些东西的价值是所有玩家的价值总和。但是,使用名为Measurable
(蹩脚名称,我知道)的接口并使用Team
和Player
,而不是使用继承。实现该接口。假设Measurable
有一个getGoals()
方法。然后,如果客户说
int goals = measurable.getGoals();
客户不知道或不关心他是否获得了团队或玩家的目标数量 - 只是该对象知道它有多少目标。
这实际上是Composite Pattern的一个例子。
所以底线是Player
不应该低于Team
,但Team
应该由Player
组成,因为它们有不同的行为。但如果它们确实具有名称,目标等共同属性,那么使用界面来表示这是描述完全不同类型对象的常用方法。
答案 3 :(得分:0)
这样做
class Player {
//player properties and setter , getter
}
class Team{
List<Player> players = new ArrayList<Player>();
// setter and getter
}
将球员添加到球队
Team t1= new Team();
Player p1 = new Player();
Player p2 = new Player();
Player p3 = new Player();
t1.getPlayers().add(p1);
t1.getPlayers().add(p2);
t1.getPlayers().add(p3);
答案 4 :(得分:0)
你需要类似的东西。
class Team {
List<Player> players;
Team() {
players = new ArrayList<Player>();
}
public void addPlayer(Player p) {
players.add(p);
}
}
这就是您创建Player
并将其添加到Team
的方式:
Player player1 = new Player();
Player player2 = new Player();
Team team1 = new Team();
team1.addPlayer(player1);
team1.addPlayer(player2);
要知道的是inheritance (is a)
与composition(has a)
的关系。
希望这有帮助。
答案 5 :(得分:0)
如果您认为Team
是Player
的容器,那么您的Team
类将包含一个包含Player
的属性,以及要添加的访问者方法,移除,清除等Team
的玩家。
当然,您的Team
类将拥有自己的属性和方法,可能会从团队中的Player
中获取数据(例如玩家数量等)。
在此实例中没有与继承相关的主题。
你的课程只有一个容器与“容器”关系(Artem的答案使用了正确的术语)。
例如:
class Team {
// the private property containing the players
// I use a Set here because each player is unique
private Set<Player> players;
public Team() {
// initializing the set as HashSet
players = new HashSet<Player>();
}
public void addPlayers(Player... players) {
// adding all players
for (Player p: players) {
this.players.add(p);
}
}
public Collection<Player> getPlayers() {
// returning a copy of the team's players
return new HashSet<Player>(players);
}
}
class Player {
// TODO player's properties such as name, age, feats, etc.
}
然后您将Player
添加到Team
中:
Team t = new Team();
// adding single player
t.addPlayers(new Player());
// adding an array of players
t.addPlayers(new Player[]{new Player(), new Player()});