2012-02-19 3 views
16

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

Если признак не определяет абстрактные методы, то 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 хорошо?

+2

Вы не можете создать экземпляр признака. Когда вы говорите 'new T {}', вы создаете анонимный объект, который смешивает черту T. – sschaef

ответ

28

Это не действует, черты автоматически абстрактно.

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

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

1

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

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

В общем,

new __t__ 

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

{ class __anonymous__ extends __t__; new __anonymous__ } 

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

Это подробно описано в section 6.10 Instance Creation Expressions of the Scala Language Specification.

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

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

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

+4

. Думаю, вы имеете в виду, что он создает анонимный * класс *, который имеет черту как mixin. –

+0

Прости, да. Объект, являющийся экземпляром анонимного класса, который является подклассом признака. Уф. –

Смежные вопросы