W Scali, jak zdefiniować parametr lokalny w podstawowym konstruktorze klasy?
W Scali, w jaki sposób można zdefiniować parametr lokalny w konstruktorze podstawowym klasy, która nie jest członkiem danych i która na przykład służy tylko do inicjalizacji elementu danych w klasie bazowej?
Na przykład, w poniższym kodzie, jak mogę poprawnie zdefiniować parametrb
w głównym konstruktorze klasyB
tak, że generuje tylko tymczasowy parametr lokalny, a nie element danych?
class A(var a: Int)
class B(?b?) extends A(b)
Randall, twoje odpowiedzi wyjaśniają, dlaczego kompilator Scali narzeka, gdy wprowadzam metodęinc
to zwiększa nieruchomośća
, ale także zmień nazwę parametru w klasieB
konstruktor dopasowujący parametr do klasyA
konstruktor:
class A(var a: Int)
class B(a: Int) extends A(a) {
def inc(value: Int) { this.a += value }
}
Wyjście kompilatora Scala:
$ scala construct.scala
construct.scala:3: error: reassignment to val
def inc(value: Int) { this.a += value }
^
one error found
Scala narzeka, ponieważ klasaB
musi teraz mieć prywatną właściwość tylko do odczytua
ze względu na odniesienie doa
winc
. Wymiana pieniędzyB(a: Int)
doB(var a: Int)
generuje inny błąd kompilatora:
construct.scala:2: error: error overriding variable a in class A of type Int;
variable a needs `override' modifier
class B(var a: Int) extends A(a) {
^
one error found
Dodawanieoverride
nie pomaga:
construct.scala:2: error: error overriding variable a in class A of type Int;
variable a cannot override a mutable variable
class B(override var a: Int) extends A(a) {
^
one error found
Jak mogę użyć tej samej nazwy w parametrze głównego konstruktoraB
jako właściwość zdefiniowana w podstawowym konstruktorze klasy bazowejA
?