2011-06-27 9 views
6

que tienen algo así como:¿Cómo acceder y mutar el campo privado en scala?

class Address(private var street:String, private var city: String, private var postCode: String) extends Model 

Cuando trato de hacer:

address = new Address(....) 
address.city = "changed" 

me sale error de compilación. Entonces, ¿cuál es la solución? Tenga en cuenta que los campos deben permanecer privados.

También hay una sintaxis de acceso directo que tener que repetir la palabra clave privada cuando todos los campos en la clase son privados?

Respuesta

18

Parece que hay un malentendido fundamental aquí. Todos los campos en Scala son privados. No es solo un defecto ni es opcional.

Por ejemplo, digamos que usted tiene esto:

class Address(var street: String) 

El campo donde se almacena street es privada. Digamos que hace esto:

val x = new Address("Downing") 
println(x.street) 

Este código no accede directamente a la esfera privada para street. x.street es un método getter.

dice que hacer esto:

x.street = "Boulevard" 

Este código no modifica directamente el campo privado para street. x.street = es en realidad el método x.street_=, que es un método setter.

No se puede acceder directamente a los campos en Scala. Todo se hace a través de getters y setters. En Scala, cada campo es privado, cada campo tiene getters, y cada var tiene setters.

+16

El tono de esta respuesta parece casi ... enojado? –

+0

No lo llamaría enojado. Gracias por explicar los conceptos @Danial – ace

+0

No enojado, enfático. Estoy siendo demasiado enfático porque sé que ese punto se hizo antes. Estoy tratando de asegurarme de que el punto está hecho aquí. –

5

Puede definir descriptores de acceso y mutadores como esto:

class Address(private var _street: String, private var _city: String, private var _postCode: String){ 
    def street = _street 
    def street_=(street: String) = _street = street 

    def city = _city 
    def city_=(city: String) = _city = city 

    def postCode = _postCode 
    def postCode_=(postCode: String) = _postCode = postCode 
} 

La necesidad de cambiar el nombre de los campos (que podrían entrar en conflicto con los parámetros con nombre) y que el constructor ignora el mutador cuando una instancia de la clase es un problema conocido, pero actualmente no se están haciendo esfuerzos para mejorar la situación.

+0

Gracias. Pero eso parece bastante complicado en Scala cuando tenemos campos privados en el constructor. ¿No sería mejor si solo definiéramos getter y setter estándar para el campo y luego hiciéramos algo como address.setStreet ("chnaged")? – ace

+3

'street' y' street_ = '_are_ nombres getter y setter estándar en Scala. Google para "Principio de acceso uniforme". –

+1

@amc La sintaxis para definir un campo privado con getters y setters públicos es 'class Address (var street: String)'. –

Cuestiones relacionadas