2012-01-21 12 views
1

は、なぜ私が持っている場合:Scalaの子クラスは親クラスの特性を継承していますか?

trait T { 
    def method(a: Int) 
} 

class A extends T { 
    //... 
} 

class B extends A { 
    //... 
} 

を、私はこれを行うとき:

//... 
val b = new B 
b.method(15) 
//... 

method()がBのために未定義すると言われていますか?なぜ私は明示的に私が欲しいものを得るために

class B extends A with T 

ことを言っているのですか?親クラスの形質は継承されていませんか?定義によって継承される親自身の方法の大きな部分を実現することができれば、どのようにすることができますか?もしそうなら、議論は何ですか?

+0

'A'と' B' 'abstract'を宣言しない限り、上記はコンパイルされません。この場合、' new'を呼び出すことはできません –

答えて

8

私は自分のコンピュータ上でそれをテストし、次のコードは動作しますので、あなただけの方法methodを実装していなかったと思う:

scala> trait T { 
| def method(a:Int) =a 
| } 
defined trait T 

scala> class A extends T 
defined class A 

scala> class B extends A 
defined class B 

scala> val b = new B 
b: B = [email protected] 

scala> b.method(11) 
res25: Int = 11 
5

の方法が実装されることはありませんので、あなたのコードは、コンパイルされません。クラスがすべて抽象クラスであるため、Bはインスタンス化できません。

は、形質Aの内部に、このような方法の本体を追加:

def method(a: Int)={ 
    //do something useful here 
} 

次にコンパイルし、エラーがない、実際、Bのインスタンスは、メソッドを使用してもよいです。

関連する問題