Возможно, эксперт Scala с хорошим чувством стиля и элегантности может помочь мне разобраться в более удобном способе структурирования следующего кода, который имеет конструкторскую проблему "push-out".
Начнем с простого базового класса:
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)
}
Как бы то ни было, когда я добавляю два бара, я возвращаюсь только к 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 (а не Foo), элегантно, без необходимости копировать и вставлять Foo add method, как показано ниже?
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, но очень важные для проверки типов), решение без вырезания и пасты выплатит дивиденды.
Спасибо!