我正在构建一个简短的基本游戏,并且已经给出了一些代码来查看。游戏中的所有角色都是游戏对象,有些是可移动的,有些则不是。可移动的有一个位置和方向。
我获得了一个MoveableObject类(如下所示)。可移动的GameObjects在自己的构造函数中实例化此类。我不能保证这段代码是对的,所以我试图掌握它背后的理论。
public class MoveableObject {
int speed;
String direction;
public MoveableObject(){
speed = 0;
direction = "unknown";
}
public MoveableObject(int iSpeed, String sDirection){
speed = iSpeed;
direction = sDirection;
}
并且所有可移动字符在构造函数中创建此类的实例。例如,来自吸血鬼类。
public class Vampire
public Vampire(){
MoveableObject thisObject = new MoveableObject(30, "South-East");
}
}
据我所知,这称为聚合。我认为这是用于HAS-A关系,而不是IS-A。由于字符是IS-A可移动对象,我应该不使用继承或接口吗?我也不明白为什么你需要创建一个MoveableObject的实例,如果每个字符都是可移动的,当然,你应该赋予它们可移动的能力(通过继承或接口),然后实例化人物?
提前致谢。
答案 0 :(得分:0)
这取决于MoveableObject
类是否也处理对象的实际移动(即根据speed
和direction
成员更新其位置)或仅保留{{} 1}}和speed
成员,以便游戏的引擎模块将使用它来计算对象的位置。
在后一种情况下,我会将direction
类的名称更改为更合适的名称,并坚持使用聚合。否则,继承将更适合可移动对象。这样,移动逻辑将实现一次,子类只能照顾自己的特定需求。
要进一步解释MoveableObject
是否只是一个数据容器,您可以创建一个接口:
MoveableObject
每个可移动的类看起来像:
public Interface Moveable {
public MoveableObject getMovementData();
}
并在您的游戏引擎中保存所有移动对象的数组(可移动类型),并在更新方法中获取移动数据并处理它:
public class Vampire implements Moveable {
.
.
private MoveableObject movementData; //
.
.
public MoveableObject getMovementData() {
return movementData;
}
}