【问题标题】:Polymorphism design fault多态性设计错误
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 每个子类都有一个将其值转换为另一个值的方法,例如:类 Mm 有方法 toInch()、toPixel()、toFootAndInch()。这超出了枚举的范围,对吗?我会研究泛型,谢谢。
  • 也看看 TimeUnit 是如何工作的,这是第一个选项的一个很好的例子。
  • 快速查看一下,似乎泛型是要走的路。我认为这就是多态性的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多