2015-04-01 57 views
1

我正在使用scala,我有一個特性與「名稱」我擴展此特徵在Userclass我在訪問屬性
當我試圖聲明名稱的特質像這錯誤屬性擴展特性在斯卡拉

val name : String 

它的子類了錯誤子類公頃未實現成員 但是當我試圖

val name : String = "" 

它只是運行良好 請告訴我,各色的NCE和原因爲什麼它不工作之前,爲什麼它是變形後的工作

+0

爲什麼你用val和className?你可以只是val name ='Joe'並且名字將會是String,對於輸入你應該使用var – Legendary 2015-04-01 12:43:49

+0

也許你應該展示實際的特質和擴展類。 – 2015-04-01 12:56:12

+0

那你真的必須在'UserClass'中提供'name'的實現,如果你還沒有這樣做的話。 – 2015-04-01 13:01:34

回答

2

我假設你的代碼看起來是這樣的:

trait hasName { 
    val name : String 
} 

class Person extends hasName 

性狀是由自然,abstract,這意味着它允許有未實現的方法。實際上,什麼trait的聲明是這樣的:

延伸hasName所有的類都是保證val name : String實例變量。什麼是變量是依賴於實際的子類

在上述情況下,你的代碼被擴展爲:

trait hasName { 
    val name : String = ??? 
} 

其中???本質上是特定的「功能」是指未實現。

您的修改後:

trait hasName { 
    val name : String 
} 

class Person extends hasName {val name : String = ""} 

延伸類,Person覆蓋hasName特徵的實現,或者在這種情況下,缺乏與它自己的實現。

或者,如果你這樣做:

trait hasName { 
    val name : String = "" 
} 

要添加實施hasName,讓每一個孩子的類將默認情況下,有落實。

+0

請告訴我當我使用這兩種方法時記憶中發生了什麼? 爲什麼第一種方法不起作用? 是不是指內存中的任何東西? – 2015-04-02 14:31:55

+0

在這種情況下,事實上在內存中沒有任何事情發生。在編譯時,'extends hasName'表明你的用戶類將有'val name:String'的實現,但是編譯器找不到這樣的實現,因此不能編譯。 – 2015-04-02 14:46:45

+0

謝謝@mechko – 2015-04-03 06:28:05