【发布时间】:2015-06-21 00:07:49
【问题描述】:
我有两个类共享一些属性和行为。一个这样的常见行为集群是 3D 空间中的操作。因此,每个都实现了接口Transformable:
public interface Transformable {
public void position (double x, double y, double z);
public void position (Tuple3d tuple);
public void rotateDeg (double yaw, double pitch, double roll);
public void rotateRad (double yaw, double pitch, double roll);
// And so on...
}
public class Foo extends Apple implements Transformable { // Foo happens }
public class Bar extends Orange implements Transformable { // Bar happens }
现在,Transformable 中每个方法的行为对于任何实现类都是相同的,并且所需的代码很多。
Foo 和 Bar 都扩展了我无法控制的不同超类,而且 Java 没有多重继承,所以这个选项不可用。
将大量代码复制粘贴到实现Transformable 的每个类中与所有编程事物都是对立的。
我能想到的最佳解决方案是创建一个包含所有实现细节的类,并使用传递方法:
public Foo extends Apple implements Transformable {
// This class has all of the repeated implementation code
private TransformationHelper helper;
public final void rotate (double yaw, double pitch, double roll) {
helper.rotate(yaw, pitch, roll);
}
}
但是,这仅比在每个类中重复代码好一点。虽然实际的实现代码在一个地方,但这仍然很笨拙。
有没有人有更好的方法来解决这个问题?
编辑:为了澄清,我确实可以控制Transformable。整个想法是:Foo 和 Bar 完全不同。它可以很容易地成为Shoe 和SpaceShuttle,但它们都存在于3D 空间中的不同位置,并且需要一个.position(x,y,z) 方法来完成完全相同的事情。
【问题讨论】:
-
您当前的解决方案是使用具有委托设计模式的组合——这有什么问题?从我的 POV 来看,它看起来不错。
-
如果行为完全相同,则将所需的getter和setter添加到接口并在接口内使用default methods。这样,如果需要,您可以偏离默认实现。
-
@HovercraftFullOfEels 似乎有更好的解决方案。我刚刚在过去一个小时内了解了设计模式......所以这是一个很好的候选者吗?
-
即使 Foo 和 Bar 还没有扩展类,许多人仍然会选择组合和委托方法,因为它具有灵活性。
-
@drmuelr 你可以在你的接口中创建默认方法(仅对 java 8 有效),然后你所有实现这个接口的类将共享相同的定义方法,见Default Methods