早上好,我有一个自定义类cBigDecimal,它扩展了BigDecimal类。我的目标是同时使用BigDecimal和cBigDecimal类中的方法(例如“ add”或“ multiply”以及自定义函数“ percentage”)。问题是“添加”和合。返回BigDecimal,显然我无法将其转换为cBigDecimal ...有什么想法吗? 提前致谢, 洛伦佐
答案 0 :(得分:3)
您的cBigDecimal
类到底做了什么而BigDecimal
没有做什么?
BigDecimal
可以完全扩展是设计疏忽。乔什·布洛赫(Josh Bloch)在有效Java 第三版第17条中说:“最小化可变性”:
人们普遍认为,在编写
BigInteger
和BigDecimal
时,不变类必须有效地终结,因此它们的所有方法都可能被覆盖。不幸的是,在保留向后兼容性的同时,这不能纠正。
如果您要做的只是向BigDecimal
“添加方法”,则可以简单地创建一个辅助方法:
static BigDecimal percent(BigDecimal b) {
return b.divide(100); // Or whatever it does.
}
然后,您可以在任何地方处理普通的旧BigDecimal
。
答案 1 :(得分:0)
BigDecimal
BigDecimal
类不可不被覆盖。应该将该类标记为final
以便在编译器中强制执行此限制,但是,遗憾的是,它并不是这样标记的(不幸的疏忽)。因此,请勿覆盖BigDecimal
。
如果想到除BigDecimal
/ BigInteger
以外的其他课程,您可以阅读我的答案的其余部分。
在polymorphism中了解有关 Object-Oriented Programming 的信息。
如果将对类型为Dog
的对象的引用分配给超类Animal
类型的变量,并且子类覆盖方法eat
,则调用方法{{1} }导致子类上的方法被执行。这就是late-binding或dynamic-dispatch的魔力(此“正确执行权利”行为的各种术语)。
eat
注意事项:确保打算重写您的超类及其方法。如果标记为Animal x = new Dog( … ) ; // Polymorphism: Viewing a `Dog` object as an `Animal` object.
x.eat( … ) ; // Results in Dog::eat method being invoked, *not* Animal::eat.
,则不会。
提示:请遵循命名约定。类始终以大写字母开头。使用final
,而不是MySubClass
作为类名。
答案 2 :(得分:0)
我会使用decorator pattern。
基本上,您将必须在WHERE
类中以私有成员的身份持有BigDecimal
的实例。要创建CBigDecimal
,您将需要一个CBigDecimal
(也可以是BigDecimal
)的实例。
然后,在您的BigDecimal.ZERO
类中,您可以提供与CBigDecimal
相同的接口(可以添加方法BigDecimal
),因为您在类中具有该方法的实例,并且您还可以创建自己的自定义方法(作为CBigDecimal#add(BigDecimal)
)。
这是示例代码:
CBigDecimal.java:
CBigDecimal#percentage(double)
然后,客户端代码将通过向其构造函数提供public class CBigDecimal
{
private BigDecimal bigDecimal;
public CBigDecimal(BigDecimal bigDecimal)
{
this.bigDecimal = bigDecimal;
}
// This method already exists in BigDecimal class, so it will have the same signature
public CBigDecimal add(BigDecimal toAdd)
{
return new CBigDecimal(bigDecimal.add(toAdd));
}
// This is the new method which you will implement as you like
public CBigDecimal percentage(double percentage)
{
BigDecimal multiplied = bigDecimal.multiply(new BigDecimal(percentage));
BigDecimal total = multiplied.divide(new BigDecimal(100));
return new CBigDecimal(total);
}
// This is another method that already exists in BigDecimal class
public double doubleValue()
{
return bigDecimal.doubleValue();
}
}
实例来创建CBigDecimal
的实例。
BigDecimal
P.S .:仅当您确实需要通过添加一堆新方法来扩展BigDecimal类时,此模式才值得。如果您只需要添加一个方法,则最好按照Andy Turner's answer的建议在某个地方声明一个静态方法。