Почему и когда черта и объект должны иметь одно и то же имя? - PullRequest
0 голосов
/ 14 января 2019

В чем причина

  trait Dog {
    def bark = "woof"
  }
  object Dog extends Dog

работает, но следующее не

trait Dog {
  def bark = "woof"
}
class Dog extends Dog

Я где-то читал, что в первом упомянутом выше случае объект не является сопутствующим объектом. Каков сценарий, когда объект и черта должны иметь одно и то же имя?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Причина, по которой второй пример здесь не срабатывает, заключается в том, что не , потому что Dog - это не объект-компаньон, а потому что вы определили новый дубликат класса Dog. Я всегда рассматриваю traits и classes как одну категорию, а objects как другую - и object - это единичный экземпляр свойства или класса.

Почему вы не можете создавать классы с одинаковыми именами? Невозможно различить две сущности, если это разрешено.

Почему вы можете создавать (класс / черта) и объект с тем же именем? Вы можете различать их, потому что class или trait - это тип , а объект - это значение .

Когда вы должны называть ваши объекты тем же именем, что и классы? Если вы не хотите определять сопутствующий объект, значит, ваши последствия для объекта будут работать. Или, если вы хотите определить удобный apply метод для объекта. В противном случае я совсем не беспокоюсь ни о том, является ли объект companion или нет, но часто для удобства создаю объекты с именем класса.

0 голосов
/ 14 января 2019

От введения к главе 2 ( Идентификаторы, имена и области применения ):

Существует два разных пространства имен, одно для типов и одно для условий .

Раздел 5.5 ( Определения объектов ) содержит почти точно ваш пример (с Point вместо Dog) со следующим комментарием:

Обратите внимание, что двойное использование имени Point допустимо, поскольку определение класса определяет имя Point в пространстве имен type , тогда как определение объекта определяет имя в термине Пространство имен.

(акцент мой)

Ваш второй пример с class Dog extends Dog не работает, так как class Dog и trait Dog попадают в пространство имен для типов, что приводит к конфликту.

Companion object s используются всякий раз, когда вы используете статические методы, например, Java (за исключением того, что сопутствующие объекты намного приятнее, потому что они, ну, в общем, объекты и могут передаваться как обычные значения).

Ситуация object Foo extends Foo выглядит несколько надуманной и довольно необычной. У вас есть реальный пример, где он используется? Если нет, то это просто угловой случай, который формально действителен, просто потому, что он явно не запрещен.

РЕДАКТИРОВАТЬ : object AnsiColor extends AnsiColor представляется одним из наиболее "важных" приложений шаблона object X extends X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...