2011-11-18 15 views
38

Si entiendo correctamente, los rasgos son lo más parecido a las interfaces Java y los constructores de clase establecen automáticamente las variables.Usando el constructor scala para establecer la variable definida en el rasgo

Pero lo que si tengo una clase que extiende un rasgo y tiene un constructor que establece una variable del rasgo, así que algo como:

trait Foo { 
    var foo: String 
} 

class Bar (foo: String) extends Foo { /* ... */ } 

Donde quiero la cadena del rasgo foo ajustar cuando Hago un objeto Bar.

El compilador parece darme errores al respecto. ¿Cuál es la forma correcta de lograr esto?

+1

Solo una nota: la inicialización del rasgo no es una cosa simple en sí misma y con las variables y la anulación se puede completar la inicialización muy rápidamente (lo hice). Asegúrate de que realmente lo necesitas. – CheatEx

Respuesta

25

Bar debe definir el resumen var foo en Foo (sería el mismo para un val). Esto se puede hacer en el constructor

class Bar(var foo: String) extends Foo{...} 

(por supuesto, se podría hacer en el cuerpo de Bar también). De forma predeterminada, los parámetros del constructor se convertirán a privado val si es necesario, es decir, si se usan fuera del código de iniciación, en los métodos. Pero se puede forzar el comportamiento marcándolos val o var, y posiblemente controlar la visibilidad como en

class X(protected val s: String, private var i: Int) 

Aquí es necesario un público var para implementar Foo.

30
trait Foo { var foo: String = _ } 
class Bar(foo0: String) extends Foo { foo = foo0 } 

El atributo declara una var no inicializada; la clase luego lo establece igual al parámetro de entrada.

Alternativamente,

trait Foo { 
    def foo: String 
    def foo_=(s: String): Unit 
} 
class Bar(var foo: String) extends Foo {} 

declara el getter pair/setter correspondiente a un foo, que se establecen por la clase.

Cuestiones relacionadas