用多态性保持球员在多项运动中得分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用多态性保持球员在多项运动中得分相关的知识,希望对你有一定的参考价值。
首先,这是针对大学的,所以我无法给出答案,而是解释了为什么我的代码不起作用并且在解决方案方面指向了正确的方向。这必须被视为学习而不仅仅是学习。我还必须更改方法名称等。
所以我有一个玩多种运动的运动员;他可能是BaseballPlayer
和/或FootballPlayer
,它们是Player
的子类。
BaseballSquad
和FootballSquad
是实际的球队,是TeamList
的子类。 TeamList
有一个阵列列表protected ArrayList<Player> team
,存储球队的球员。玩家通过TeamList
方法添加到ArrayList:
public void addPlayer(Player player)
{
team.add(player);
}
每个球员类(Baseball
或Football
)都有自己的积分计数方法,只有points
和goals
不同。出于分配的目的,通过toString()
方法访问玩家和他的计票。这些是通过使用TeamList
类型的Iterator
通过Player
打印的。
将玩家添加到多个体育作品中;打印一个团队的球员名单列表。
什么不起作用是打印正确的分数计数。例如,如果我有一支Baseball
球队并且我向该球队添加了Football player
,那么打印的是球员的goal
计数,而不是他的Baseball points
。
据我所知,在runtime
期间,班级类型保持不变,但我需要它能够在某种意义上改变一个球员的级别,因为我希望一个Football
球员被认为是一个Baseball
球员,如果这是他所玩的运动。
我觉得我在其他代码工作时在某个地方犯了一个愚蠢的错误。无论是那个还是我到目前为止都已经淹没了它。任何帮助都很感激,我很抱歉我无法显示整个代码!
不幸的是,您尝试完成的任务在Java中是可撤消的。玩家的对象只有一个真正的类,你当然可以在多态层次结构上向上或向下投射,但是将一个FootballPlayer投射到BaseballPlayer会导致错误。您可以将棒球运动员与足球运动员一起添加到集合中的原因是Java中的集合是协变的(here解释)。
我可以建议的最接近的解决方案是尝试更复杂的类层次结构,因为Java允许我们一次实现多个接口(与仅扩展一个类的限制相反)。
希望我能以一种方式帮助您自己完成任务。
什么不起作用是打印正确的分数计数。例如,如果我有一支棒球队,并且我向该球队添加一名足球运动员,那么打印的是球员的进球数,而不是他的棒球分数。
好吧,这没有任何意义,为什么Football
球员会与Baseball
联系?在这种情况下,该程序如何区分它应该从Score
得到的Player
,这样做是否有意义?
如果它在现实世界中没有意义,那么它在虚拟世界中也不太可能有意义
据我所知,在运行期间,类类型保持不变但我需要它能够在某种意义上改变玩家的类,因为我希望足球运动员被认为是棒球运动员,如果这是他所玩的运动。
我猜你的假设是正确的,因为FootballPlayer
并没有神奇地改变为BaseballPlayer
。 Baseball
不允许你添加任何其他类型的Player
然后BaseballPlayer
s。 FootballPlayer
可以打Baseball
的唯一方法是,如果他们也是BaseballPlayer
。
现在,在Java中你可以通过interfaces
的用户实现这一点,所以玩家可以玩多项运动,你需要克服的问题,是如何获得Player
的特定Sport
的分数 - 这个信息应该在哪里保持?它属于Sport
还是Player
?
让我们退后一步,试着看看更大的图景。根据你的描述,你有......
- 一个
Player
,可能会发挥零或更多Sport
s - 一个
Sport
,可能有零个或多个Player
s(但可能不会有相同的Player
一次)。Sport
是特定类型的Player
的容器(即Baseball
是BaseballPlayer
s的容器) - 一个
Score
,与Player
和Sport
相关联。你如何管理这取决于你,我建议你直接将Score
与Player
联系起来。
所以,基本概念是:
Sport
可能包含零个或多个(特定)Player
s,但可能只包含任何给定Player
的单个实例(Fred无法播放Baseball
两次)- 一个
Player
可以发挥多个Sport
s(这可以通过使用interface
s实现),所以弗雷德可以发挥Baseball
和Football
- 对于给定的
Score
,Player
与Sport
相关
由于基线要求似乎是Sport
需要能够列出Player
的得分和(我假设),有可能列出他们所有的Player
s的Sport
得分,让我有意义允许Player
管理Score
。
那么,你可能会想象一个Player
“可能”看起来像这样......
public interface Player {
// Bunch of other functionality...
public List<Sport> getSports();
public Map<Sport, Score> getScores();
public Score getScore(Sport sport);
}
这意味着当你想为给定的Score
列出所有Player
s的Sport
s时,Sport
将循环通过它的List
的Player
并为自己获得Score
,也许是这样的......
for (Player player : players) {
Score score = player.getScore(this);
}
但是如果你想知道给定的Score
的所有Sport
s / Player
s,你可以直接从Player
自己获得这些信息。
这只是一个广泛的想法/概念,试图解耦一些代码并提供一个广泛的基线,您可以从中开发更复杂的关系/数据
多态性不会改变对象的基本类型。它只是允许对象的行为/行为类似于不同类型的对象(混淆)。也就是说,你可以有一个Player
表现得像一个BaseballPlayer
和一个FootballPlayer
。
从代码的角度定义上下文,如果它期望一个BaseballPlayer
,它只会看到一个BaseballPlayer
。
interface
只是定义了一个对象保证提供的契约,所以如果它implements
BaseballPlayer
,它保证实现BaseballPlayer
界面所需的所有功能,同样可以说FootballPlayer
。
如果这两个类具有重叠的功能(即getScore
),那么你需要能够管理它,以便getScore
方法知道它被调用的上下文(这就是我将Sport
传递给它的原因),否则你的实现没有希望知道应该传回什么 - 它缺乏背景
以上是关于用多态性保持球员在多项运动中得分的主要内容,如果未能解决你的问题,请参考以下文章