【发布时间】:2010-01-04 16:14:49
【问题描述】:
我在下面定义了两个类:
public class junk {
private BigInteger a = BigIngeger.valueOf(1), b=BigInteger.valueOf(2), c;
public void DoSomething() {
c = a.add(b);
}
// ... other stuff here
}
public class junkChild extends junk {
private BigDecimal a = BigDecimal.valueOf(1), b=BigDecimal.valueOf(2), c;
// I want a, b, c to override the original BigInteger a,b,c
// ... other stuff here
}
public class myClass {
public static void main(String args[]) {
junk a1 = new junkChild();
a1.DoSomething();
}
}
不幸的是,上述方法不起作用。
我想要做的只是将junkChild 中的a、b、c 更改为BigDecimal,而无需再次重写DoSomething()。即使我必须再次编写它,代码也会完全一样,所以应该有一种方法可以让我无需编写它就可以完成这项工作。 DoSomething 函数应该检查 a1 类型是否具有正确输入和返回类型的 add 方法,如果是,则调用它而不必担心 a、b、c 的类型是。
这个可以吗?
【问题讨论】:
-
你应该阅读反思。它将满足您问题的第二部分。至于第一部分,不要直接使用字段
a、b和c,而是使用您在子类中覆盖的方法getA、getB和getC。 -
听起来您真正想要的是类 C++ 模板。
-
听起来他真正想要的是“鸭子打字”。
-
ok 反射似乎可以让我为所欲为。顺便说一句,我想我可以重载字段如下
junk xyz; xyz = new junkChild(); -
太糟糕了。 请不要使用反射来解决这个问题。这是一个丑的解决方案。您原来的包装方法解决方案更加更干净。
标签: java class field overloading anonymous