为了账号安全,请及时绑定邮箱和手机立即绑定

Java多态指针

Java多态指针

函数式编程 2021-10-27 16:40:17
我一直在研究 Java,但遇到了一个我无法解决的问题(我做了研究,但因为这是一个非常具体的问题,所以没有找到答案):我正在尝试以与接口相同的方式添加类继承的变量和方法(有一个由已经有祖先的不同类继承的类,即:Actor extends Character 和 Weapon extends Item,我需要两者Actor 和 Weapon 具有 XY 坐标、宽度/高度和 move() 方法)起初我认为接口是解决方案,但由于它们是 100% 抽象的,我每次都需要重新定义方法,对我来说,在这种情况下,这超出了继承的目的。我曾想过在祖先树的根部创建一个上级父类(如 MovableObject),其中包括 Item 和 Actor 类,但由于它们在其他方面都如此不同,因此将它们置于同一祖先中感觉是违反逻辑的树。编辑谢谢大家的回复,我说过我会在尝试时更新,我做到了,但现在我意识到我的整个代码需要大量重构,所以我无法立即告诉你它是否有效. 虽然它确实解决了我的问题,因为我至少有一些事情要做。
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

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

  • 接口:定义不相关对象之间的通用行为(例如,可以序列化的对象、可以比较的对象等)。

  • 抽象类:定义跨对象层次结构的公共行为(例如,在 中定义方法并getPrice在 中Item继承该方法是有意义的Weapon)。

在你的榜样,等方法getWidth()getHeight()getX()getY()都不错的候选人接口(因为它们共享不相关的对象之间有一些共同的特点)。


查看完整回答
反对 回复 2021-10-27
?
慕森卡

TA贡献1806条经验 获得超8个赞

// 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 确定宽度和高度)?


这些接口应该由您的两个祖先类(Character和Item)实现并通过层次结构继承。难道不是之间添加一个共同的祖先Character和Item只是让你能避免实施getX和getY的两倍。


关于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地方或一个对象,你会聚集在这两个Character和Item并委托给它的move实施。


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


希望这可以帮助!


查看完整回答
反对 回复 2021-10-27
  • 2 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信