通过多态性在多项运动中保持球员得分

时间:2018-01-03 02:26:45

标签: java inheritance polymorphism

首先,这是针对大学的,所以我无法给出答案,而是解释了为什么我的代码不起作用,并指出了解决方案的正确方向。这必须被视为学习而不仅仅是学习。我还必须更改方法名称等。

所以我有一个玩多种运动的运动员;他可能是BaseballPlayer和/或FootballPlayer,它们是Player的子类。

BaseballSquadFootballSquad是实际的团队,是TeamList的子类。 TeamList有一个arrayList protected ArrayList<Player> team,用于存储球队的球员。玩家通过TeamList方法添加到ArrayList:

public void addPlayer(Player player)
    {
        team.add(player);
    }

每个玩家类(BaseballFootball)都有自己的积分计数方法,区别仅在于pointsgoals。出于分配的目的,通过toString()方法访问玩家和他的计票。这些是使用TeamList类型Iterator通过Player打印的。

将球员添加到多个体育作品中;打印一个团队球员名单的作品。

什么不起作用是打印正确的分数。例如,如果我有一个Baseball团队,并且我向该团队添加了Football player,那么打印的是播放器的goal标记,而不是他的Baseball points

据我所知,在runtime期间,班级类型保持不变,但我需要它能够在某种意义上改变玩家的班级,因为我希望Football玩家成为如果这是他参加的运动,则被认可为Baseball球员。

我觉得我在其他代码工作时在某个地方犯了一个愚蠢的错误。无论是那个还是我到目前为止都已经淹没了它。任何帮助都很感激,我很抱歉我无法展示整个代码!

2 个答案:

答案 0 :(得分:0)

不幸的是,您尝试完成的内容在Java中是可撤消的。玩家的对象只有一个真正的类,你当然可以在多态层次结构上向上或向下投射,但是将一个FootballPlayer投射到BaseballPlayer会导致错误。您可以将棒球运动员添加到该系列中的原因是Java中的集合是协变的(解释为here)。

我可以建议的最接近的解决方案是尝试更复杂的类层次结构,因为Java允许我们一次实现多个接口(与仅扩展一个类的限制相反)。

希望我能以一种让您自己完成任务的方式提供帮助。

答案 1 :(得分:0)

  

什么不起作用是打印正确的分数。例如,如果我有一支棒球队,并且我为该球队添加了一名足球运动员,那么打印的是球员的进球数,而不是他的棒球分数。

好的,这没有任何意义,为什么Football玩家会与Baseball相关联?在这种情况下,该计划如何区分Score应该从Player获得什么?这样做是否有意义?

如果它在现实世界中没有意义,那么它在虚拟世界中也不太可能有意义

  

据我所知,在运行期间,类类型保持不变但我需要它能够在某种意义上改变玩家的类,因为我希望足球运动员被认为是棒球如果这是他参加的运动,那就是球员。

我猜你的假设是正确的,因为FootballPlayer并没有神奇地改变为BaseballPlayerBaseball不允许您添加任何其他类型的Player,而不是BaseballPlayerFootballPlayer可以Baseball播放BaseballPlayer的唯一方法是interfaces

现在,在Java中你可以通过Player的用户实现这一点,因此玩家可以玩多项运动,你需要克服的问题是如何获得Sport&#39;特定Sport的得分 - 这些信息应该保存在哪里?它属于Player还是Player

让我们退后一步,试着看看更大的图景。根据你的描述,你有......

  • Sport,可能会发挥零或更多Sport s
  • 一个Player,可能有零个或多个Player s(但可能已经赢得了相同的Sport一次)。 Player是特定类型Baseball的容器(即BaseballPlayerScore s的容器)
  • Player,与SportScore相关联。您如何管理这取决于您,我建议您直接将PlayerSport相关联。

所以,基本概念是:

  • Player可能包含零个或多个(特定)Player个,但可能只包含任何给定Baseball的单个实例(Fred无法播放{{1}两次)
  • Player可以播放多个Sport(可以通过使用interface来实现),因此Fred可以播放BaseballFootball
  • Score与给定Player
  • Sport相关联

由于基线要求似乎是Sport需要能够列出Player的分数和(我假设),因此可以列出Player所有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); } &#34;可能&#34;看起来像这样...

Score

这意味着当您要为给定Player的所有Sport列出Sport时,List会循环显示Player Score {1}} for (Player player : players) { Score score = player.getScore(this); } 并获得Score,也许是这样的......

Sport

但是,如果您想了解给定Player的所有Player s / Player,您可以直接从BaseballPlayer本身获取该信息。

这只是一个广泛的想法/概念,试图将一些代码分离并提供一个广泛的基线,您可以从中开发更复杂的关系/数据

多态性不会改变对象的基本类型。它只是允许对象的行为/行为类似于不同类型的对象(混淆)。也就是说,您可以FootballPlayer表现得像BaseballPlayerBaseballPlayer

从代码的角度定义了上下文,如果它需要interface,它只会看到implements

BaseballPlayer只是定义了一个对象保证提供的契约,所以如果BaseballPlayer FootballPlayer,它保证实现getScore接口所需的所有功能同样可以说getScore

如果这两个类具有重叠的功能(即Sport),那么您需要能够管理它,以便var myRevealingModule = (function () { var privateVar = "Ben Cherry", publicVar = "Hey there!"; function privateFunction() { console.log( "Name:" + privateVar ); } function publicSetName( strName ) { privateVar = strName; } function publicGetName() { privateFunction(); } // Reveal public pointers to // private functions and properties return { setName: publicSetName, greeting: publicVar, getName: publicGetName }; })(); myRevealingModule.setName( "Paul Kinlan" ); 方法知道调用它的上下文(这就是为什么我将{{1}}传递给它,否则你的实现无法知道应该传回什么 - 它缺乏上下文