首页 > 解决方案 > Java多态指针

问题描述

我一直在研究java,但遇到了一个我无法解决的问题(我做了研究,但因为这是一个非常具体的问题,所以没有找到答案):

我正在尝试添加将由类以与接口相同的方式继承的变量和方法(有一个由已经有祖先的不同类继承的类,即:Actor extends Character 和 Weapon extends Item,我需要两者Actor 和 Weapon 具有 XY 坐标、宽度/高度和 move() 方法)

起初我认为接口是解决方案,但由于它们是 100% 抽象的,所以我每次都需要重新定义方法,对我来说,在这种情况下,这超出了继承的目的。

我曾考虑在祖先树的根部创建一个上级父级(如 MovableObject),其中将包括 Item 和 Actor 类,但由于它们在其他方面都如此不同,因此将它们放在同一个祖先中感觉反逻辑树。

编辑

谢谢大家的回复,我说过我会在尝试时更新,我做到了,但现在我意识到我的整个代码需要大量重构,所以我不能马上告诉你它是否有效. 虽然它确实解决了我的问题,因为我至少有一些工作要做。

标签: javagenericspolymorphism

解决方案


您可以使用的语言结构是接口抽象类

  • 接口:定义跨不相关对象的共同行为(例如,可以序列化的对象、可以比较的对象等)。
  • 抽象类:getPrice定义对象层次结构中的通用行为(例如,在 中定义一个方法并在 中Item继承该方法是有意义的Weapon)。

在您的示例中,诸如getWidth(),和之类的方法是接口的良好候选者(因为它们在不相关的对象之间共享一些共同特征)。getHeight()getX()getY()

// Another way to share this state would be via a Point interface and 
// aggregating two point objects in your Item and Character classes
interface Coordinates {

    double getX1();

    double getY1();

    double getX2();

    double getY2();

}

interface Dimension {

    double getWidth();

    double getHeight();

}

我不知道你的整个背景,但你确定你需要坐标和尺寸(我认为你可以从 X 和 Y 确定宽度和高度)?

这些接口应该由您的祖先类 (CharacterItem) 实现并通过层次结构继承。不要Characterand之间添加一个共同的祖先,Item这样您就可以避免实现getXandgetY两次。

关于move方法,我认为这是另一个责任,您应该在其他地方定义它。

// Not necessarily the right name
class MoveHelper {

    // You can pass either a Character or an Item here
    // since both implement Coordinates
    // Not necessarily the right signature
    void move (Coordinates object)

}

根据您选择设计解决方案的方式,该move方法可以成为static某个地方或一个对象,您可以在两者中聚合CharacterItem委托给它以move实现。

最后一点,考虑您可以通过继承(接口和抽象类)或组合(如果您将聚合MoveHelper并委托给它以move实现Characterand中的实现,您会做什么)来实现重用Item

希望这可以帮助!


推荐阅读