2011-06-27 11 views
6

mam coś takiego:Jak uzyskać dostęp i zmutować prywatne pole w scala?

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

Kiedy próbuję zrobić:

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

otrzymuję błąd kompilacji. Więc jakie jest rozwiązanie? Pamiętaj, że pola muszą pozostać prywatne.

Czy jest tam też składnia skrótu, niż powtarzanie słowa kluczowego private, gdy wszystkie pola w klasie są prywatne?

Odpowiedz

18

Wygląda na to, że istnieje fundamentalne nieporozumienie. Wszystkie pola w Scali są prywatne. To nie tylko domyślne, ani opcjonalne.

Na przykład, powiedzmy, że masz to:

class Address(var street: String) 

Pole, gdzie jest przechowywana street jest prywatny. Powiedzieć to zrobić:

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

Kod ten nie ma bezpośredniego dostępu do pola prywatnego dla street. x.street to metoda pobierająca .

Say to zrobić:

x.street = "Boulevard" 

Ten kod nie bezpośrednio modyfikować pole prywatny dla street. x.street = jest w rzeczywistości metodą x.street_=, która jest metodą ustawiającą ustawiającą.

Nie można bezpośrednio uzyskać dostępu do pól w Scali. Wszystko odbywa się za pomocą modułów pobierających i ustawiających. W Scali każde pole jest prywatne, każde pole ma wartości pobierające, a każde var ma setery.

+16

Ton tej odpowiedzi wydaje się prawie ... zły? –

+0

Nie nazwałbym tego rozgniewaniem. Dzięki za wyjaśnienie pojęć @Danial – ace

+0

Niezadowolony, pełen empatii. Jestem nadmiernie empatyczny, ponieważ wiem, że punkt został już wcześniej zrobiony. Próbuję się upewnić, że tutaj jest mowa. –

5

Można zdefiniować akcesorów i mutatorów tak:

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 
} 

konieczności zmiany nazwy pola (które mogłyby kolidować z wymienionych parametrów) i że konstruktor ignoruje mutator przy uruchamianiu klasę Jest to znany problem, ale obecnie nie podejmuje się żadnych wysiłków w celu poprawy sytuacji.

+0

Dzięki. Ale to wydaje się dość kłopotliwe, aby przejść przez scala, gdy mamy prywatne pola w konstruktorze. Czy nie byłoby lepiej, gdybyśmy zdefiniowali standardowego gettera i ustawiacza dla pola, a następnie zrobiliby coś w stylu address.setStreet ("chnaged")? – ace

+3

'ulica' i' ulica_ = '_ są_ standardowe nazwy pobierających i ustawiających w Scali. Google dla "Jednolity zasada dostępu". –

+1

@amc Składnia do definiowania prywatnego pola z publicznymi programami pobierającymi i ustawiającymi to 'class Address (var street: String)'. –

Powiązane problemy