2011-07-29 20 views
5

Quiero especificar el color de los animales una vez, y es el mismo para todos los animales de la misma especie.¿Cómo declaras valores y métodos de objetos abstractos en scala?

Así que me gustaría hacer:

abstract object Animal {val color: String} 

Y luego especificar los colores de los animales individuales con

object Dog extends Animal {val color = "green"} 

Esto tiene que estar en el objeto, como ya tengo una convención que no puede haber El cambio de solo hacer animales con el método de fábrica también se declara en el objeto Animal, y los métodos de fábrica necesitan acceso al color. p.

abstract object Animal { 
    val color: String 
    def makeAnimal(args): Animal = ... 
} 

¿Cómo puedo hacer esto en scala, dado que "solo las clases pueden tener miembros declarados pero indefinidos"?

Puedo pensar en una forma hacky de hacer esto usando rasgos, pero espero que haya algo mejor.

[EDITAR] Resulta que no puedo usar rasgos para guardar los valores/métodos por razones complicadas. La solución actual implica el registro estático del objeto hijo con el objeto principal utilizando un rasgo, y eso me permite acceder a los valores y métodos sin carácter que deben definirse en un objeto. Todavía estoy esperando una mejor solución.

Respuesta

15

No se puede ampliar object s, por definición. Así que sí, se necesita un rasgo, pero no se ve nada de esto hacky:

trait AnimalCompanion { 
    val color: String 
    def makeAnimal(args): Animal // if you have same args everywhere 
} 

object Dog extends AnimalCompanion { 
    val color = ... 
    def makeAnimal(args) = ... 
} 

o incluso mejor

trait AnimalCompanion[A <: Animal] { 
    val color: String 
    def makeAnimal(args): A 
} 

class Dog extends Animal 

object Dog extends AnimalCompanion[Dog] { 
    val color = ... 
    def makeAnimal(args): Dog = ... 
} 
Cuestiones relacionadas