Вы можете написать почти то же самое в Scala, гораздо более кратко:
class Shape(var `type`: String)
class Square(name: String) extends Shape(name)
В первой строке тот факт, что type
предшествует var
, заставляет компилятор добавлять методы получения и установки (из "5.3 Определения классов" в спецификации ):
Если формальному объявлению параметра x : T
предшествует val или
var ключевое слово, определение метода доступа (получателя) (§4.2) для этого параметра неявно добавляется в класс. Получатель вводит значение члена x
класса c
, которое определяется как псевдоним параметра. Если вводным ключевым словом является var , средство доступа к сеттеру x _=
(§4.2) также неявно добавляется в класс.
Во второй строке name
не предшествует val
или var
, и поэтому он является просто параметром конструктора, и в этом случае мы передаем конструктор суперкласса в предложении extends
. Для name
не добавляются методы получения или установки, поэтому, если мы создали экземпляр square
со значением Square
и вызвали square.name
, он не скомпилировался бы.
Обратите внимание, что type
- это ключевое слово в Scala, поэтому мне пришлось заключать его в обратные кавычки как в определении, так и в приведенном выше примере:
Пример 1.1.2 Заключенные в кавычки строки представляют собой решение, когда необходимо получить доступ к идентификаторам Java, которые являются зарезервированными словами в Scala.
Существует множество ресурсов, которые вы можете прочитать для получения дополнительной информации о наследовании в Scala. См., Например, главы 4 и 5 Программирование Scala .