也许一位对Scala具有优雅风格感觉的专家可以帮我找出更好的方法来构造下面这个代码,它存在一个构造函数“推出”的问题。
我们从一个简单的基类开始:
class Foo(val i: Int, val d: Double, val s: String) {
def add(f: Foo) = new Foo(i + f.i, d + f.d, s + f.s)
override def toString = "Foo(%d,%f,%s)".format(i,d,s)
}
为了在一个复杂的应用程序中进行类型检查,我需要一个没有任何额外状态的子类:
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
目前情况是,当我添加两个Bars时,我只会得到一个Foo:
val x = new Bar(1,2.3,"x")
val y = new Bar(4,5.6,"y")
val xy = x.add(y)
在 REPL 中得到以下响应:
x : Bar = Bar(1,2.300000,x)
y : Bar = Bar(4,5.600000,y)
xy : Foo = Foo(5,7.900000,xy)
我该如何优雅地使两个Bar相加组成一个新的Bar(而不是Foo),而不必复制并粘贴Foo的add方法,以下是代码示例?
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
// ugly copy-and-paste from Foo:
def add(b: Bar) = new Bar(i + b.i, d + b.d, s + b.s)
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
我有许多这样的Bar(本质上都是Foo的副本,但对于类型检查非常重要),一个无需复制和粘贴的解决方案将会收到丰厚的回报。
谢谢!