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
的意义 - 避免浮动- 表示金额时出现舍入错误。
当你使用组合时,你可以只公开你想要的方法,例如add
和 subtract
,在每个数学运算期间没有覆盖方法和创建新的 subclass 对象。数学运算是在一个实例变量上完成的,而不是在 class 作为一个整体,作为一个实现细节。
我想用钱算一笔账。为了防止舍入错误,我决定使用 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
的意义 - 避免浮动- 表示金额时出现舍入错误。
当你使用组合时,你可以只公开你想要的方法,例如add
和 subtract
,在每个数学运算期间没有覆盖方法和创建新的 subclass 对象。数学运算是在一个实例变量上完成的,而不是在 class 作为一个整体,作为一个实现细节。