首先,这是针对大学的,所以我无法给出答案,而是解释了为什么我的代码不起作用,并指出了解决方案的正确方向。这必须被视为学习而不仅仅是学习。我还必须更改方法名称等。
所以我有一个玩多种运动的运动员;他可能是BaseballPlayer
和/或FootballPlayer
,它们是Player
的子类。
BaseballSquad
和FootballSquad
是实际的团队,是TeamList
的子类。 TeamList
有一个arrayList 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
球员。
我觉得我在其他代码工作时在某个地方犯了一个愚蠢的错误。无论是那个还是我到目前为止都已经淹没了它。任何帮助都很感激,我很抱歉我无法展示整个代码!
答案 0 :(得分:0)
不幸的是,您尝试完成的内容在Java中是可撤消的。玩家的对象只有一个真正的类,你当然可以在多态层次结构上向上或向下投射,但是将一个FootballPlayer投射到BaseballPlayer会导致错误。您可以将棒球运动员添加到该系列中的原因是Java中的集合是协变的(解释为here)。
我可以建议的最接近的解决方案是尝试更复杂的类层次结构,因为Java允许我们一次实现多个接口(与仅扩展一个类的限制相反)。
希望我能以一种让您自己完成任务的方式提供帮助。
答案 1 :(得分:0)
什么不起作用是打印正确的分数。例如,如果我有一支棒球队,并且我为该球队添加了一名足球运动员,那么打印的是球员的进球数,而不是他的棒球分数。
好的,这没有任何意义,为什么Football
玩家会与Baseball
相关联?在这种情况下,该计划如何区分Score
应该从Player
获得什么?这样做是否有意义?
如果它在现实世界中没有意义,那么它在虚拟世界中也不太可能有意义
据我所知,在运行期间,类类型保持不变但我需要它能够在某种意义上改变玩家的类,因为我希望足球运动员被认为是棒球如果这是他参加的运动,那就是球员。
我猜你的假设是正确的,因为FootballPlayer
并没有神奇地改变为BaseballPlayer
。 Baseball
不允许您添加任何其他类型的Player
,而不是BaseballPlayer
。 FootballPlayer
可以Baseball
播放BaseballPlayer
的唯一方法是interfaces
。
现在,在Java中你可以通过Player
的用户实现这一点,因此玩家可以玩多项运动,你需要克服的问题是如何获得Sport
&#39;特定Sport
的得分 - 这些信息应该保存在哪里?它属于Player
还是Player
?
让我们退后一步,试着看看更大的图景。根据你的描述,你有......
Sport
,可能会发挥零或更多Sport
s Player
,可能有零个或多个Player
s(但可能已经赢得了相同的Sport
一次)。 Player
是特定类型Baseball
的容器(即BaseballPlayer
是Score
s的容器)Player
,与Sport
和Score
相关联。您如何管理这取决于您,我建议您直接将Player
与Sport
相关联。所以,基本概念是:
Player
可能包含零个或多个(特定)Player
个,但可能只包含任何给定Baseball
的单个实例(Fred无法播放{{1}两次)Player
可以播放多个Sport
(可以通过使用interface
来实现),因此Fred可以播放Baseball
和Football
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
表现得像BaseballPlayer
和BaseballPlayer
。
从代码的角度定义了上下文,如果它需要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}}传递给它,否则你的实现无法知道应该传回什么 - 它缺乏上下文