Эта тема обсуждалась ранее, но не была удовлетворительно удовлетворена (на мой взгляд). Рассмотрим следующий код SCALA:scala переопределяет параметры класса
class A(a:Int) { val _a=a }
class A1(val a:Int) { val _a=a }
class B(a:Int) extends A(a) // OK
class C(val a:Int) extends A(a) // OK
class B1(a:Int) extends A1(a) // OK
class C1(val a:Int) extends A1(a) // fails
class D1(override val a:Int) extends A1(a) // OK
Я считаю, что объявление параметра класса, как вал только оказывает влияние на вызов конструктора: параметр копируется вместо передачи ссылки. Однако в каждом случае поле класса выделяется как val. это верно?
Теперь я не понимаю, почему нам нужно переопределить ключевое слово в последней строке. Обратите внимание, что мы не объявляем классы как классы классов, поэтому автоматическое распределение полей не происходит.
Наконец, есть веская причина, по которой кто-то даже хотел бы определить класс типа A1 с параметром класса val ?
Заранее благодарим за все ответы.
Didier: Хорошо, спасибо, это действительно очищает много путаницы. –
Почему я получаю 'm: m' в' class A1 (val a: Any) {def test = a}; класс C1 (переопределение val a: Any) расширяет A1 (12) {переопределить def toString = s "$ a: $ test"}; println (новый C1 ("m")) '? Что означает, что «А1 получит доступ к нему»? –