Возможно, эксперт по 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)
}
В нынешнем виде, когда я добавляю два Bar, я получаю только 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)
Как сделать так, чтобы два Bars складывались вместе, чтобы сформировать еще один Bar (а не Foo) элегантным способом, без необходимости копировать и вставлять метод add Foo, как показано ниже?
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)
}
У меня много таких Баров (все по сути копии Foo, но очень важны для проверки типов), решение без вырезания и вставки принесет дивиденды.
Спасибо!