【问题标题】:Calling method in subclass with access to its super class在子类中调用方法并访问其超类
【发布时间】:2012-03-14 04:41:09
【问题描述】:

我正在为 Android 制作足球游戏。

我有一个播放器类。 Player 由 DefencivePlayer 和 OffensivePlayer 扩展。这些类中的每一个都实现了一个触摸事件,它们都是独一无二的。我有另一个类,移动器,它处理可以访问播放器的触摸。 (如下图)

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

我认为让这两个类扩展 Player 类的设计是错误的,因为它不能确保存在子类。

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

【问题讨论】:

  • 我遇到的问题是犹豫。我想要的功能正是我的程序在我测试它时的行为方式。我假设子类中的方法将被忽略,因为它们不需要存在。感谢所有非常快速的回复

标签: java android oop design-patterns


【解决方案1】:

我做了一个快速测试 - 使用您的类图,我设置了三个玩家类并创建了一个通用的 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() 方法只会从@ 的子类的实例中执行987654328@.

【讨论】:

    【解决方案2】:

    我不确定我是否正确理解了您的问题,但您当前的设置似乎没有任何问题。

    只要Touch()方法是abstract(使Player被声明为abstract class Player),或者Player被定义为interface Player,你就可以使用player.Touch()并确保已实现的方法被调用。

    【讨论】:

      【解决方案3】:

      您可以制作Player.Touch() abstract。这将确保子类将提供自己的实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多