在子类中调用方法,可以访问其超类

时间:2012-03-14 04:41:09

标签: java android oop design-patterns

我正在为Android制作足球比赛。

我有一个班级球员。玩家由DefencivePlayer和OffensivePlayer扩展。这些类中的每一个都实现了触摸事件,并且它们都是唯一的。我有另一个类,移动器,它处理可以访问Player的触摸。 (见下文)

FootballGameUML

播放器始终是DefencivePlayer或OffensivePlayer。我希望能够通过简单地调用Player.touch来处理触摸的功能,并且根据它的不同,将在DefencivePlayer或OffensivePlayer中调用相应的触摸方法。

我相信我设计的两个类扩展了Player类是错误的,因为它不能确保有子类。

请帮忙,我真的想在这里设计一个好的设计,不想破解任何东西。

3 个答案:

答案 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。这将确保子类将提供自己的实现。