我正在实现一些数学类,并且第一次发现Java(繁琐和重复的代码)问题,而切割器编码实际上无法克服这些问题。运算符重载非常方便,还有一些Groovy可以做得更好的事情(我也可以尝试Scala)。
所以我还在用Java编写主要类(现在是Complex和Matrix),但是我将从Groovy中使用它们。
我更改了某些方法(.add)的名称以利用运算符重载(.plus)。
现在,我的类与“Number”基类进行了很好的交互,所以我可以使用:
complex.add(number); //or
complex = complex + number;
得到一个很棒的答案,但我不能使用:
complex = number + complex
因为数字不理解.add(数字),即使它确实如此,如果它变成一个复杂的数字,它也不会知道如何处理数字。
我可以写一个number.plus(复数)并将其添加到数字界面吗?代码实际上非常简单,我可以撤销它:
Number plus(complex) {
return complex.plus(this);
}
这适用于类型号的所有内容,但我不知道Groovy是否可以在事后将其移植到数字接口。 (另外,Number和Complex都是Java,所以我认为这是groovy的一个加载项。)
还有其他建议吗?我应该放弃并学习Scala吗?
哦,我意识到可能有一些包可以做到这一点,但部分原因只是学习数学,我正在研究量子计算文本,并且正在实施练习。
答案 0 :(得分:2)
您可以将所需方法作为闭包添加到Number
元类。
例如(利用加法的交换性):
Number.metaClass.plus << { Complex complex ->
complex.plus(delegate)
}
在此之后,任何Number
子类也可以在等式的左侧。确保使用追加运算符<<
以避免破坏其他重载加上元方法。数字被引用为delegate
而不是this
,因为它是一个闭包。