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);
}