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?

questionAnswers(4)

yourAnswerToTheQuestion