从方法返回动态分配的类的对象

时间:2010-08-17 00:49:01

标签: java subclassing

这可能有一个非常简单的解决方案,但我似乎无法弄明白......
我们有一堆xQuantity形式的类,例如DistanceQuantity,AreaQuantity等,它们扩展了一个DimensionQuantity类。现在你可以添加或减去DistanceQuantity或AreaQuantity等,但你不能混合它们。所有子类都有add(),subtract(),ge()等方法,因此将共享逻辑放入DimensionQuantity会很好,但我会继续遇到强制转换问题。

到目前为止,我提出的最好的方法是生成一个对象,然后将其转换为子类的方法,但最好完全摆脱子类add()(以及其他类似的方法)!这是代码(遗漏了一些东西):

在DistanceQuantity中:

public DistanceQuantity add(DistanceQuantity d1) {
 Object o = new DistanceQuantity(scalar + d1.scalar, REF_UNIT);     
 return (DistanceQuantity) o;
    }

在DimensionQuantity中:

@SuppressWarnings({"rawtypes", "unchecked"})
  public Object add(DimensionQuantity d1)  {

 Class c1 = this.getClass();
 Class c2 = d1.getClass();
 if (c1 != c2)
    throw new RuntimeException();
 double d = scalar + d1.scalar;
 Constructor c = null;  
 c = c1.getConstructor(Double.TYPE, AbstractUnit.class);
 Object o = null;  
 o = c.newInstance(d, REF_UNIT);  
 return o;
    }

有人(或某些人)可以提出更好的方法吗?!

2 个答案:

答案 0 :(得分:1)

使用如下的类声明:class Dimension<T extends Dimension<T>> {...}。这允许您指定类似class AreaDimension extends Dimension<AreaDimension> {...}的子类。

请注意,我认为你这样做的方式是错误的 - 如果你打算使用Distance,Area,Volume类,那么除了值,指数或维度之外 - 简单的距离有维度1,Area有2 ,音量有3.这使你可以正确地进行乘法和除法。

如果您将拥有多个单位,请对各个单位使用枚举,并为每个单位的维度使用数组。

答案 1 :(得分:0)

这个问题已经消失了 - 我找到了一个非常不同的解决方案,所以我相信这个答案会关闭这个问题!然而,它提出了一个相关的问题,关于如何在Java语言中获得“宏”或“模板”设施,但这可能不是构成它的论坛......如果有人可以建议我应该问它的地方(或者有答案),我很想听听。再次感谢大家。