这可能有一个非常简单的解决方案,但我似乎无法弄明白......
我们有一堆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;
}
有人(或某些人)可以提出更好的方法吗?!
答案 0 :(得分:1)
使用如下的类声明:class Dimension<T extends Dimension<T>> {...}
。这允许您指定类似class AreaDimension extends Dimension<AreaDimension> {...}
的子类。
请注意,我认为你这样做的方式是错误的 - 如果你打算使用Distance,Area,Volume类,那么除了值,指数或维度之外 - 简单的距离有维度1,Area有2 ,音量有3.这使你可以正确地进行乘法和除法。
如果您将拥有多个单位,请对各个单位使用枚举,并为每个单位的维度使用数组。
答案 1 :(得分:0)
这个问题已经消失了 - 我找到了一个非常不同的解决方案,所以我相信这个答案会关闭这个问题!然而,它提出了一个相关的问题,关于如何在Java语言中获得“宏”或“模板”设施,但这可能不是构成它的论坛......如果有人可以建议我应该问它的地方(或者有答案),我很想听听。再次感谢大家。