2012-01-21 134 views
1

爲什麼,如果我有:斯卡拉孩子類繼承父類特質?

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''抽象',否則上面不會編譯,在這種情況下你不能調用'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不能被實例化,因爲這些類都是抽象的。

添加方法體中就是這樣,性狀的內部:

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

然後它編譯並沒有錯誤,而事實上,B的實例可以使用的方法。