я использую scala, и у меня есть черта с атрибутом "имя", я расширил этот признак в Userclass, где я обращаюсь к атрибуту
когда я пытался объявить имя в черте, как это
val name : String
он дал ошибку в дочернем классе, что дочерний класс ha не реализовал элемент, но когда я попытался
val name : String = ""
он просто отлично работал, пожалуйста, скажите мне разницу и причину, почему он не работал раньше и почему он работал после модификации
Я предполагаю, что ваш код выглядит примерно так:
trait hasName {
val name : String
}
class Person extends hasName
Характеристика, по своей природе, abstract
, что означает, что она позволила иметь нереализованные методы. По сути, то, что объявляет trait
заключается в следующем:
Все классы, расширяющие
hasName
, гарантированно имеютval name: String
переменная экземпляраval name: String
. То, что находится в этой переменной, зависит от фактического дочернего класса
В вышеприведенном случае ваш код расширяется до:
trait hasName {
val name : String = ???
}
где ???
означает, что особая "функция" не реализуется.
После вашего изменения:
trait hasName {
val name : String
}
class Person extends hasName {val name : String = ""}
hasName
класс, Person
переопределяет реализацию hasName
или, в этом случае, ее отсутствие, с его собственной реализацией.
В качестве альтернативы, если вы это сделаете:
trait hasName {
val name : String = ""
}
Вы добавляете реализацию в hasName
, поэтому каждый дочерний класс будет по умолчанию иметь эту реализацию.
extends hasName
указывает, что ваш пользовательский класс будет иметь реализацию val name : String
, но компилятор не находит такой реализации и, следовательно, не компилирует.