Ответ 1
Это не влияет, черты автоматически абстрактны.
Модификатор абзаца используется в определениях классов. Он избыточен для признаков и обязателен для всех других классов, которые имеют неполную члены.
Мне интересно, что такое семантика использования ключевого слова abstract
в сочетании с trait
.
Если черта не определяет абстрактные методы, ключевое слово abstract
не мешает мне создать экземпляр:
scala> abstract trait T
defined trait T
scala> new T{}
res0: java.lang.Object with T = [email protected]
С другой стороны, если черта определяет абстрактный метод, я не могу создать экземпляр (без реализации этого метода, конечно) независимо от того, присутствует ли ключевое слово abstract
или нет:
scala> abstract trait T { def foo : Unit }
defined trait T
scala> new T{}
<console>:9: error: object creation impossible, since method foo in trait T of type => Unit is not defined
new T{}
^
scala> trait T { def foo : Unit }
defined trait T
scala> new T{}
<console>:9: error: object creation impossible, since method foo in trait T of type => Unit is not defined
new T{}
^
Итак, каково ключевое слово abstract
перед trait
хорошим для?
Это не влияет, черты автоматически абстрактны.
Модификатор абзаца используется в определениях классов. Он избыточен для признаков и обязателен для всех других классов, которые имеют неполную члены.
Вы не создаете экземпляр признака. Черты не могут быть созданы.
Вы создаете экземпляр анонимного класса, расширяющего черту.
В общем случае
new __t__
эквивалентно
{ class __anonymous__ extends __t__; new __anonymous__ }
(где __anonymous__
- новое имя анонимного класса, недоступного для пользовательской программы).
Это подробно описано в разделе раздел 6.10 Экземпляры создания экземпляра Scala Спецификация языка.
Итак, причина, по которой вы можете создать экземпляр в первом случае, заключается в том, что вы не создаете экземпляр признака (который является абстрактным), а объект (а это не так).
Во втором случае причина, по которой вы не можете создать экземпляр, заключается в том, что если вы наследуете что-то, будь то черта или класс, вам в конечном итоге необходимо реализовать свои абстрактные методы где-то вдоль цепочки наследования, чтобы для его создания. В первом случае не существует абстрактных методов.
Ключевое слово abstract
само по себе не имеет значения: черты неявно абстрактны, ключевое слово избыточно.