Class 从超类类型扩展到 BigDecimal returns 对象

Class extended to BigDecimal returns object from superclass type

我想用钱算一笔账。为了防止舍入错误,我决定使用 BigDecimal 而不是 double 或 float。现在我想,这不是一个好主意,因为它使计算变得极其困难。

我创建了一个从 BigDecimal 扩展而来的名为 Euro 的 class 以覆盖 toString 和 equals 方法。

现在,如果我想向欧元对象添加一个数字,我会这样做

Euro sum = (new Euro(10)).add(new Euro(15));

这里的问题是 add(...) returns 来自 class BigDecimal 的一个对象,我无法将其转换为欧元,所以我将其添加到欧元 class :

public Euro add(Euro euro){
    return new Euro(euro.add((BigDecimal) this).floatValue());
}

我现在可以做什么,而不是用 Euro 重写 BigDecimal 的所有方法?我想,最好的解决方案是使用整数代替 BigDecimal,因为我无法写

int sumCents = 1000 + 1500;

而不是上面的长期。

在这种情况下,更倾向于组合而不是继承。当您将 class 转换为 BigDecimal 以生成 Euro 时,您是在说 Euro 一个 BigDecimal.更准确的说法是 Money BigDecimal (或者通常是一个数量)。它也有一个符号,这里是欧元。

您也可以使用不同的实现方式,例如您已经想到的美分数,将金额存储为整数。这是从 BigDecimal 继承的线索是不正确的。此外,在 Euro 上调用 pow 没有意义,即使它在 BigDecimal 上有意义。 Euro 不是 BigDecimal.

此外,调用 floatValue(或 doubleValue)只是为了转换为 Euro 会破坏首先使用 BigDecimal 的意义 - 避免浮动- 表示金额时出现舍入错误。

当你使用组合时,你可以只公开你想要的方法,例如addsubtract,在每个数学运算期间没有覆盖方法和创建新的 subclass 对象。数学运算是在一个实例变量上完成的,而不是在 class 作为一个整体,作为一个实现细节。