我正在使用scala,我有一個特性與「名稱」我擴展此特徵在Userclass我在訪問屬性
當我試圖聲明名稱的特質像這錯誤屬性擴展特性在斯卡拉
val name : String
它的子類了錯誤子類公頃未實現成員 但是當我試圖
val name : String = ""
它只是運行良好 請告訴我,各色的NCE和原因爲什麼它不工作之前,爲什麼它是變形後的工作
我正在使用scala,我有一個特性與「名稱」我擴展此特徵在Userclass我在訪問屬性
當我試圖聲明名稱的特質像這錯誤屬性擴展特性在斯卡拉
val name : String
它的子類了錯誤子類公頃未實現成員 但是當我試圖
val name : String = ""
它只是運行良好 請告訴我,各色的NCE和原因爲什麼它不工作之前,爲什麼它是變形後的工作
我假設你的代碼看起來是這樣的:
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
,讓每一個孩子的類將默認情況下,有落實。
請告訴我當我使用這兩種方法時記憶中發生了什麼? 爲什麼第一種方法不起作用? 是不是指內存中的任何東西? – 2015-04-02 14:31:55
在這種情況下,事實上在內存中沒有任何事情發生。在編譯時,'extends hasName'表明你的用戶類將有'val name:String'的實現,但是編譯器找不到這樣的實現,因此不能編譯。 – 2015-04-02 14:46:45
謝謝@mechko – 2015-04-03 06:28:05
爲什麼你用val和className?你可以只是val name ='Joe'並且名字將會是String,對於輸入你應該使用var – Legendary 2015-04-01 12:43:49
也許你應該展示實際的特質和擴展類。 – 2015-04-01 12:56:12
那你真的必須在'UserClass'中提供'name'的實現,如果你還沒有這樣做的話。 – 2015-04-01 13:01:34