Абсолютно нет, и ваш пример демонстрирует почему. Вы ввели изменчивую переменную value
, которая может быть инициализирована или не инициализироваться - в зависимости от используемого конструктора.
Это потенциальный источник для множества проблем, и поэтому Scala приняла решение, что создание всех объектов в конечном итоге должно осуществляться через первичный конструктор, что обеспечивает согласованную инициализацию.
Если вы хотите, чтобы value
имел значение по умолчанию, вы можете указать его как параметр по умолчанию (в 2.8 +):
abstract class Father(val value : Int = 0)
или вы можете использовать вспомогательный конструктор для достижения того же эффекта в Scala 2.7:
abstract class Father(val value : Int) {
def this() = this(0)
}
Если Father
определен любым из вышеперечисленных способов, оба следующих определения child являются действительными:
class Child(v:Int) extends Father(v)
class Child extends Father()
Вы также можете сделать value
переменную, если вам абсолютно необходимо, но я настоятельно рекомендую это сделать.
Если семантика value
означает, что допустимо не инициализироваться, то правильная идиома Scala - объявить ее как Option[Int]
:
abstract class Father(val value : Option[Int] = Some(0))