Семантика абстрактных черт в Scala - программирование
Подтвердить что ты не робот

Семантика абстрактных черт в Scala

Мне интересно, что такое семантика использования ключевого слова 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 хорошим для?

4b9b3361

Ответ 1

Это не влияет, черты автоматически абстрактны.

Модификатор абзаца используется в определениях классов. Он избыточен для признаков и обязателен для всех других классов, которые имеют неполную члены.

http://www.scala-lang.org/docu/files/ScalaReference.pdf

Ответ 2

Вы не создаете экземпляр признака. Черты не могут быть созданы.

Вы создаете экземпляр анонимного класса, расширяющего черту.

В общем случае

new __t__

эквивалентно

{ class __anonymous__ extends __t__; new __anonymous__ }

(где __anonymous__ - новое имя анонимного класса, недоступного для пользовательской программы).

Это подробно описано в разделе раздел 6.10 Экземпляры создания экземпляра Scala Спецификация языка.

Итак, причина, по которой вы можете создать экземпляр в первом случае, заключается в том, что вы не создаете экземпляр признака (который является абстрактным), а объект (а это не так).

Во втором случае причина, по которой вы не можете создать экземпляр, заключается в том, что если вы наследуете что-то, будь то черта или класс, вам в конечном итоге необходимо реализовать свои абстрактные методы где-то вдоль цепочки наследования, чтобы для его создания. В первом случае не существует абстрактных методов.

Ключевое слово abstract само по себе не имеет значения: черты неявно абстрактны, ключевое слово избыточно.