Семантика абстрактных черт в Scala - PullRequest
16 голосов
/ 19 февраля 2012

Мне интересно, какова семантика использования ключевого слова abstract в сочетании с trait.

Если черта не определяет какие-либо абстрактные методы, ключевое слово abstract не мешает мнеот создания экземпляра:

scala> abstract trait T
defined trait T

scala> new T{}
res0: java.lang.Object with T = $anon$1@12cd927d

С другой стороны, если черта действительно определяет абстрактный метод, я не могу создать экземпляр (без реализации этого метода, конечно), независимо от того, является ли ключевое слово 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?

Ответы [ 2 ]

30 голосов
/ 19 февраля 2012

Не имеет никакого эффекта, черты автоматически становятся абстрактными.

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

http://www.scala -lang.org / доку / файлы / ScalaReference.pdf

1 голос
/ 19 февраля 2012

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

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

Как правило,

new __t__

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

{ class __anonymous__ extends __t__; new __anonymous__ }

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

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

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

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

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

...