Java 利用多态性保持运动员在多项运动中的得分
首先,这是针对大学的,所以我无法得到答案,而是解释了为什么我的代码不起作用,并指出了解决方案的正确方向。这必须被视为学习,仅此而已。我还必须更改方法名称等 所以我有一个运动员,他从事多种运动;他可能是Java 利用多态性保持运动员在多项运动中的得分,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,首先,这是针对大学的,所以我无法得到答案,而是解释了为什么我的代码不起作用,并指出了解决方案的正确方向。这必须被视为学习,仅此而已。我还必须更改方法名称等 所以我有一个运动员,他从事多种运动;他可能是棒球运动员和/或足球运动员,这是球员的子类 棒球队和足球队是实际的球队,是球队列表的子类TeamList有一个arrayList受保护的arrayList团队,用于存储团队的球员。玩家通过TeamList方法添加到ArrayList: public void addPlayer(Player pla
棒球运动员
和/或足球运动员
,这是球员
的子类
棒球队
和足球队
是实际的球队,是球队列表
的子类TeamList
有一个arrayList受保护的arrayList团队
,用于存储团队的球员。玩家通过TeamList
方法添加到ArrayList:
public void addPlayer(Player player)
{
team.add(player);
}
每个球员级别(无论是棒球
还是足球
)都有自己的计分方法,只在得分
和进球
方面有所不同。为了进行分配,玩家和他的记录通过toString()
方法访问。通过使用Player
类型的Iterator
通过TeamList
打印
将一名球员添加到多个体育作品中;打印一个球队球员的名单很有效
不起作用的是打印正确的分数记录。例如,如果我有一个棒球队
并且我向该队添加了一名足球运动员
,那么打印的是球员的进球
记录,而不是他的棒球积分
据我所知,在运行时
类类型保持不变,但在某种意义上,我需要它能够改变一名球员的类,因为我希望一名足球
球员被识别为棒球
球员,如果他从事的是这项运动
我觉得在代码的其余部分工作时,我在某个地方犯了一个愚蠢的错误。要么这样,要么到目前为止我侥幸成功。非常感谢您的帮助,我很抱歉无法显示整个代码 不幸的是,您试图实现的目标在Java中是不可撤销的。玩家的对象只有一个真实的类,你当然可以在多态层次上向上或向下投射它,但是将足球运动员投射到棒球运动员会导致错误。可以将足球运动员和棒球运动员一起添加到集合中的原因是Java中的集合是协变的(解释) 我能建议的最接近的解决方案是试验更复杂的类层次结构,因为Java允许我们一次实现多个接口(与仅扩展一个类的限制相反) 希望我能帮上忙,让你自己完成任务 不起作用的是打印正确的分数记录。例如,如果我有一个棒球队,我将一名足球运动员加入该队,那么打印的是该球员的进球记录,而不是他的棒球得分 好吧,那没有任何意义,为什么一个
足球
球员会和棒球
联系在一起?在这种情况下,程序如何区分从玩家
处获得的分数
,这样做是否有意义
如果它在现实世界中没有意义,那么在虚拟世界中也不可能有意义
据我所知,在运行期间,类类型保持不变,但从某种意义上说,我需要它能够改变一个球员的类,因为我希望一个足球运动员被认可为棒球运动员,如果这是他从事的运动
我想你的假设是对的,足球运动员不会神奇地变成棒球运动员<代码>棒球不应允许您添加任何其他类型的球员
其他棒球球员
s。一个足球运动员
打棒球
的唯一方法就是如果他们也是棒球运动员
现在,在Java中,您可以通过接口的用户来实现这一点,因此一个玩家可以进行多种运动,您需要克服的问题是,如何获得玩家对特定运动的得分-这些信息实际上应该保存在哪里?它属于运动
还是玩家
让我们后退一步,试着看一看更大的图景。根据你的描述你有
- 一个
玩家
,可以玩零个或更多运动
s
- 一个
Sport
,它可能有零个或多个玩家
s(但可能不会有相同的玩家
多次)。Sport
是特定类型的球员的容器(即棒球
是棒球球员
的容器)
- 一个
分数
,它与球员
和运动
关联。如何管理这一点取决于您,我建议将分数
与玩家
直接关联
因此,基本概念是:
Sport
可以包含零个或多个(特定的)Player
s,但只能包含任何给定Player
的一个实例(Fred不能打棒球两次)
- 一名
球员
可以玩多个运动
s(可通过使用界面
s实现),因此弗雷德可以玩棒球
和足球
- 对于给定的
运动
由于基线要求似乎是运动
需要能够列出运动员
的分数,并且(我假设)可以列出运动员
在所有运动
比赛中的分数,因此允许运动员对我来说是有意义的
public interface Player {
// Bunch of other functionality...
public List<Sport> getSports();
public Map<Sport, Score> getScores();
public Score getScore(Sport sport);
}
for (Player player : players) {
Score score = player.getScore(this);
}