Tal vez un experto en Scala con un buen sentido del estilo y la elegancia me puede ayudar a encontrar una manera más agradable de estructurar el siguiente código, que tiene un problema de "expulsión" del constructor.Diseño modular de Scala: ¿cómo evito un modelo repetitivo "push-out"?
partimos de una clase base simple:
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)
}
Para efectos de tipo de comprobación en una aplicación compleja, requiero una subclase sin ningún estado adicional:
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
Tal como está Cuando agrego dos barras, solo obtengo un Foo:
val x = new Bar(1,2.3,"x")
val y = new Bar(4,5.6,"y")
val xy = x.add(y)
con la siguiente respuesta en el REPL:
x : Bar = Bar(1,2.300000,x)
y : Bar = Bar(4,5.600000,y)
xy : Foo = Foo(5,7.900000,xy)
¿Cómo llego a dos bares se suman para formar otro bar (en lugar de un Foo), de una manera elegante, sin tener que copiar y pegar método add de Foo, como a continuación?
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)
}
tengo muchos de estos bares (todos esencialmente copias de Foo, pero muy importante para la comprobación de tipos), una solución de cortar y pegar de libre pagará dividendos.
Gracias!
Me gusta el "parámetro como etiqueta" idea, para la seguridad de tipos. ¡Gracias! –