【发布时间】:2015-11-30 16:29:59
【问题描述】:
背景:
我有 4 个表示度量单位的类:Mm、Inch、Pixel、FootAndInch。
每个类都是 BigDecimal 的包装类,它们都有相同的方法子集:
...
add(BigDecimal value)
divide(BigDecimal value)
multiple(BigDecimal value)
subtract(BigDecimal value)
...
在每个单独的类中重复相同的方法似乎很乏味。所以我创建了一个抽象类(称为“Unit”),希望每个方法只需要编写一次并利用多态性:
public abstract class Unit {
BigDecimal value;
public Unit(BigDecimal value) {
this.value = value;
}
public Unit(int value) {
this.value = new BigDecimal(value);
}
public Unit(String value) {
this.value = new BigDecimal(value);
}
public Unit(Unit unit) {
this.value = unit.bigDecimal();
}
public abstract Unit add(int value);
public abstract Unit add(int value, MathContext mathContext);
public abstract Unit add(Unit value);
public abstract Unit add(Unit value, MathContext mathContext);
public abstract Unit add(BigDecimal value);
public abstract Unit add(BigDecimal value, MathContext mathContext);
public abstract Unit divide(Unit value, MathContext mathContext);
public abstract Unit divide(int value, MathContext mathContext);
public abstract Unit divide(BigDecimal value, MathContext mathContext);
public abstract Unit[] divideAndRemainder(Unit value, MathContext mathContext);
public abstract Unit multiply(BigDecimal value);
public abstract Unit multiply(BigDecimal value, MathContext mathContext);
public abstract Unit multiply(int value);
public abstract Unit multiply(int value, MathContext mathContext);
public abstract Unit multiply(Unit value);
public abstract Unit multiply(Unit value, MathContext mathContext);
public abstract Unit negate();
public abstract Unit plus();
public abstract Unit remainder(Unit value, MathContext mathContext);
public abstract Unit subtract(int value);
public abstract Unit subtract(int value, MathContext mathContext);
public abstract Unit subtract(Unit value);
public abstract Unit subtract(Unit value, MathContext mathContext);
public abstract Unit subtract(BigDecimal value);
public abstract Unit subtract(BigDecimal value, MathContext mathContext);
public double doubleValue() {
return value.doubleValue();
}
public float floatValue() {
return value.floatValue();
}
public int intValue() {
return value.intValue();
}
public BigDecimal bigDecimal() {
return value;
}
@Override public abstract String toString();
}
现在 Mm、Inch、Pixel、FootAndInch 分别扩展 Unit
问题: 以下语句引发错误:
Mm value1 = new Mm(1000);
Mm result = value1.divide(new Mm(10), new MathContext(10, RoundingMode.CEILING));
“不兼容的类型:单位无法转换为毫米”。
我理解错误,但我不知道如何重新排列我的代码,以便我只编写一次方法。有什么建议吗?
编辑: 澄清一下,Unit 类的方法是在 Unit 类中实现的。我没有将它们包括在内以尝试缩短问题。
【问题讨论】:
-
你考虑过参数化你的类吗?
-
这和泛型一样吗?
-
是的,显然我忘记了正确的术语
标签: java polymorphism