【发布时间】:2014-01-11 22:50:19
【问题描述】:
我正在制作游戏。我有一个实体类,它是一对 x,y 坐标和宽度和高度。
我想将此实体类子类化为许多新类,以添加功能组的组合。我想添加几个“组”功能:
Moveable {
public float getVelocityX();
public void setVelocityX(float velocityX);
public float getVelocityY();
public void setVelocityY(float velocityY);
public void moveRelative(float dx, float dy);
public void setPosX(float posX);
}
和
Rotatable {
public void setAngularVelocity(float degreesPerSecond);
public void setAbsoluteAngle(float angle);
}
和
Resizable {
void setAbsoluteSize(int width, int height);
void setRelativeSize(int widthGrowFactor, int heightGrowFactor);
public void setWidth(float width);
public void setHeight(float height);
}
...以及更多(可更新、可绘制、可碰撞)。
一些实体可以旋转/被绘制但不能移动/碰撞/更新/调整大小:“静态”不可触摸的东西,例如背景动画(云、太阳、星星)。
一些实体可以移动/旋转/被绘制/更新/碰撞/调整大小:玩家角色和怪物。
某些实体只能被绘制:游戏的 HUD。
一些实体可以移动/被绘制/更新/碰撞,但不能旋转/调整大小:例如枪声。
如您所见,我需要上述功能的组合,并且可以通过一些多重继承轻松解决。
为什么不用你问的接口来做呢?因为那会让我为所有方法复制/粘贴大量代码,并且创建新类型的实体类将永远引入复制/粘贴。
您可能会问,为什么我不只是创建一个可以完成所有工作的子类,然后覆盖不应与空方法一起使用的方法,或者在那些无效的方法中抛出 UnsupportedOperationException?即使每个方法中只有一行,这仍然是复制/粘贴。一个只能 move() 的实体可能会以 50 个方法结束,并带有“throw new UnsupportedOperationException();”。这是不可接受的。
如果你建议适配器模式,我希望你能发布一个适配器模式如何做类似事情的示例(我已经对此进行了辩论)。
如果您建议作文,请说明我将如何访问受保护的字段。
谢谢!
【问题讨论】:
-
您所描述的可以使用接口而不是子类轻松实现。另一种方法是使用对象组合而不是继承。如果您有多个使用相同“代码”的接口实现,则可以将代码重构为 Action f.e.然后将实现传递给具体操作(类似于命令模式)
-
随意展示如何。
-
看起来使用“has-a”关系(has-a Location,has-a Size)比尝试使用继承要容易得多。
-
这样的问题会使所有实例都具有相同的方法,并且在那些云不可碰撞的实例中,您建议我在这些方法中做什么?抛出不受支持的异常?我已经在我的问题中讨论过这个解决方案。
-
您可能有兴趣知道使用 java 8(我认为下个月发布)您可以实现安全的多重继承形式,因为接口被允许default methods 从而接口可以具有方法主体除非实现类提供自己的实现
标签: java oop inheritance multiple-inheritance