多态性设计错误



背景:

我有4个类代表一个度量单位:毫米、英寸、像素、英尺和英寸。

每个类都是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,Foot和Inch每个扩展单位

问题:以下语句引发错误:

Mm value1 = new Mm(1000);
Mm result = value1.divide(new Mm(10), new MathContext(10, RoundingMode.CEILING));

"不兼容的类型:单位无法转换为Mm"。

我理解这个错误,但我不知道如何重新排列代码,所以我只写一次方法。有什么建议吗?

编辑:为了澄清,Unit类方法是在Unit类中实现的。我没有把它们包括在内,试图缩短这个问题。

我看到了两个选项:要么只创建一个类,为测量类型保留一个int和一个enum(不需要多态性)。或者将Unit变成一个通用的超类Unit,并使所有抽象函数返回类型T。然后将Mm定义为类Mm扩展Unit。

最新更新