ошибка в атрибуте расширена из черты в Scala

1

я использую scala, и у меня есть черта с атрибутом "имя", я расширил этот признак в Userclass, где я обращаюсь к атрибуту
когда я пытался объявить имя в черте, как это

val name : String

он дал ошибку в дочернем классе, что дочерний класс ha не реализовал элемент, но когда я попытался

val name : String = ""

он просто отлично работал, пожалуйста, скажите мне разницу и причину, почему он не работал раньше и почему он работал после модификации

  • 0
    Почему вы используете val с className? вы можете просто val name = 'Joe' и name будет String, для ввода вы должны использовать var
  • 0
    Может быть, вы должны показать реальную черту и расширение класса.
Показать ещё 1 комментарий
Теги:

1 ответ

2
Лучший ответ

Я предполагаю, что ваш код выглядит примерно так:

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, поэтому каждый дочерний класс будет по умолчанию иметь эту реализацию.

  • 0
    пожалуйста, скажите мне, что происходит в памяти, когда я использовал эти два подхода? почему первый подход не сработал? Разве это не относится к чему-либо в памяти?
  • 0
    На самом деле в этом случае ничего «не происходит в памяти». Во время компиляции extends hasName указывает, что ваш пользовательский класс будет иметь реализацию val name : String , но компилятор не находит такой реализации и, следовательно, не компилирует.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню