【问题标题】:Returning object of dynamically allocated class from method从方法返回动态分配的类的对象
【发布时间】:2010-08-17 00:49:01
【问题描述】:

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

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

距离数量:

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

在维度数量中:

@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;
    }

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

【问题讨论】:

  • 哪个版本的 C 会有所帮助:)
  • 嗯,这回答了这个问题,哈哈。我不知道 re: java 但听起来你需要查看泛型
  • 好吧,如果您可以布置类层次结构并解释您在此处尝试执行的操作,将会有所帮助。你的问题很模糊。
  • 通过“混合”它们,您是指足以处理任何一种类型(因此相同维度)的两个对象的通用方法,还是添加两个可能不同类型(和不同维度)的值?

标签: java subclassing


【解决方案1】:

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

请注意,我认为您这样做是错误的 - 如果您要使用距离、面积、体积类,那么除了值、指数或维度之外,简单的距离有维度 1,面积有 2 , 卷有 3。这可以让你正确地做乘法和除法。

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

【讨论】:

  • 谢谢大家!实际上,我尝试了太多的通用性,这会花费我想要的静态类型检查。我想我现在有一个很好的妥协。所以请忽略上面的代码 - 但你的 cmets 很有帮助!
【解决方案2】:

这个问题几乎已经消失了 - 我找到了一个非常不同的解决方案,所以我相信这个答案会关闭这个问题!然而,它引发了一个相关的问题,即如何将“宏”或“模板”工具引入 Java 语言,但这可能不是提出它的论坛......如果有人能建议我应该在哪里问它(或有答案),我很想听听。再次感谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多