2012-02-19 12 views
16

と組み合わせてabstractキーワードを使用する意味はなんですか?形質は抽象メソッドを定義しない場合は、私が作成することはできません。一方、Scalaの抽象的な特質の意味

scala> abstract trait T 
defined trait T 

scala> new T{} 
res0: java.lang.Object with T = [email protected] 

:形質は任意の抽象メソッドを定義していない場合は

abstractキーワードは、インスタンスを作成するから私を防ぐことはできません。 (もちろん、このメソッドを実装せずに)インスタンス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キーワードは何ですか210良い?

+2

形質のインスタンスを作成することはできません。あなたが '新しいT {}'と言うとき、あなたは形質をミックスする匿名のオブジェクトを作ります。 – sschaef

答えて

28

効果はありません。形質は自動的に抽象的です。

抽象修飾子はクラス定義で使用されます。それは特性のために冗長な であり、不完全な のメンバーを持つ他のすべてのクラスには必須です。

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

1

あなたは形質のインスタンスを作成していません。形質をインスタンス化することはできません。

特性を拡張する匿名クラスのインスタンスを作成しています。一般に

new __t__ 

は(__anonymous__ユーザプログラムにアクセス不可能である匿名クラスの新鮮名前ある)

{ class __anonymous__ extends __t__; new __anonymous__ } 

と等価です。

詳細はsection 6.10 Instance Creation Expressions of the Scala Language Specificationです。

したがって、最初のケースでインスタンスを作成できる理由は、特性(抽象である)のインスタンスを作成するのではなく、オブジェクト(そうでない)を作成するためです。

2番目のケースでは、インスタンスを作成できないのは、何かを継承した場合、それが特性であろうとクラスであろうと、最終的に抽象メソッドを継承チェーンのどこかに実装する必要があるからです。それをインスタンス化する。最初のケースでは、実装する抽象メソッドはありません。

abstractキーワード自体は違いがありません。形質は暗黙的に抽象的であり、キーワードは冗長です。

+4

私はあなたがmixinとしての特性を持つ匿名クラス*を作成していると思います。 –

+0

申し訳ありません。特性のサブクラスである匿名クラスのインスタンスであるオブジェクト。 Phew。 –

関連する問題