java - Java多态指针
问题描述
我一直在研究java,但遇到了一个我无法解决的问题(我做了研究,但因为这是一个非常具体的问题,所以没有找到答案):
我正在尝试添加将由类以与接口相同的方式继承的变量和方法(有一个由已经有祖先的不同类继承的类,即:Actor extends Character 和 Weapon extends Item,我需要两者Actor 和 Weapon 具有 XY 坐标、宽度/高度和 move() 方法)
起初我认为接口是解决方案,但由于它们是 100% 抽象的,所以我每次都需要重新定义方法,对我来说,在这种情况下,这超出了继承的目的。
我曾考虑在祖先树的根部创建一个上级父级(如 MovableObject),其中将包括 Item 和 Actor 类,但由于它们在其他方面都如此不同,因此将它们放在同一个祖先中感觉反逻辑树。
编辑
谢谢大家的回复,我说过我会在尝试时更新,我做到了,但现在我意识到我的整个代码需要大量重构,所以我不能马上告诉你它是否有效. 虽然它确实解决了我的问题,因为我至少有一些工作要做。
解决方案
您可以使用的语言结构是接口或抽象类。
- 接口:定义跨不相关对象的共同行为(例如,可以序列化的对象、可以比较的对象等)。
- 抽象类:
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 确定宽度和高度)?
这些接口应该由您的祖先类 (Character
和Item
) 实现并通过层次结构继承。不要在Character
and之间添加一个共同的祖先,Item
这样您就可以避免实现getX
andgetY
两次。
关于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
and中的实现,您会做什么)来实现重用Item
。
希望这可以帮助!
推荐阅读
- azure - Azure 防火墙入站流量日志
- javascript - 使用 Jquery 根据 [title] 显示和隐藏元素
- powerbi - 查找在同一列中按值过滤的第一个和最后一个日期
- face-detection - MNN 人脸检测 AAR
- .net - 访问特定数据实体时实体框架超时
- python - discord.py rewrite 如何将函数名变成命令?
- gradle - Gradle - 从 build.gradle 中的任务调用另一个插件任务
- html - Flexbox组件在使用css gap属性时间距不一致
- python - 使用 sklearn 管道对 tf-idf 向量进行 K 折逻辑回归
- django - “DecimalField”类未定义“__sub__”,因此不能在其实例上使用“-”运算符