Forse un esperto di Scala con un buon senso dello stile e dell'eleganza può aiutarmi a capire un modo migliore per strutturare il seguente codice, che ha un problema di "push-out" del costruttore.Design modulare di Scala: come evitare un boiler "push-out" del costruttore?
Iniziamo con una semplice classe di base:
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)
}
Per scopi di tipo-controllo in un'applicazione complessa, ho bisogno di una sotto-classe senza alcuna condizione aggiuntiva:
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
Così com'è , quando aggiungo due barre, ottengo solo 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 seguente risposta nel REPL:
x : Bar = Bar(1,2.300000,x)
y : Bar = Bar(4,5.600000,y)
xy : Foo = Foo(5,7.900000,xy)
Come posso ottenere due barre di aggiungere insieme per formare un altro bar (piuttosto che un Foo), in modo elegante, senza dover copiare e incollare metodo add di Foo, come di seguito?
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)
}
Ho molti di questi bar (tutti essenzialmente copie di Foo, ma molto importante per il controllo di tipo), una soluzione cut-and-paste-libera pagherà dividendi.
Grazie!
Mi piace il "parametro come etichetta" idea, per la sicurezza di tipo. Grazie! –