我正在为Android制作足球比赛。
我有一个班级球员。玩家由DefencivePlayer和OffensivePlayer扩展。这些类中的每一个都实现了触摸事件,并且它们都是唯一的。我有另一个类,移动器,它处理可以访问Player的触摸。 (见下文)
播放器始终是DefencivePlayer或OffensivePlayer。我希望能够通过简单地调用Player.touch来处理触摸的功能,并且根据它的不同,将在DefencivePlayer或OffensivePlayer中调用相应的触摸方法。
我相信我设计的两个类扩展了Player类是错误的,因为它不能确保有子类。
请帮忙,我真的想在这里设计一个好的设计,不想破解任何东西。
答案 0 :(得分:2)
我做了一个快速测试 - 使用你的类图,我设置了三个玩家类,并创建了一个通用的ArrayList<Player>
进攻和防守球员名单。打印出此代码的结果:
players.add(new OffensivePlayer());
players.add(new DefensivePlayer());
players.add(new OffensivePlayer());
players.add(new OffensivePlayer());
players.add(new DefensivePlayer());
for(Player p: players)
p.touch();
给了我这个输出:
Touched offensive player.
Touched defensive player.
Touched offensive player.
Touched offensive player.
Touched defensive player.
换句话说,不同类型的玩家被解释为子类,而不仅仅是Player
的一个实例。
从设计的角度来看,将Player
作为抽象类可能是值得的,从而确保不会创建普通的Player
对象,因此touch()
方法只会从Player
的子类的实例。
答案 1 :(得分:0)
我不确定我是否正确理解了您的问题,但您当前的设置似乎没有任何问题。
只要Touch()
方法为abstract
(将Player
声明为abstract class Player
),或将播放器定义为interface Player
,您就会能够使用player.Touch()
并确保调用已实现的方法。
答案 2 :(得分:0)
您可以Player.Touch()
abstract
。这将确保子类将提供自己的实现。