我越來越迷惑。我在我現有的項目中找到了。一些地方extends
和一些地方with
。我無法找到不同的人,請你幫助我。斯卡拉 - 擴展與
回答
在斯卡拉,您可以繼承class
es(具體或abstract
)和trait
s。類似於只能擴展一個類的方法,但在Java中實現儘可能多的接口,只允許從一個class
繼承,但只能繼承一個trait
。
如果要擴展class
,該類應該緊跟在extends
關鍵字後面。任何你要延伸的trait
都應遵循,由with
關鍵字隔開。
如果您不擴展課程,則可以將第一個trait
放在extends
關鍵字的後面,並在此之後繼續。
正如在Java中,每類是Object
一個子類,你是否顯式聲明與否,在斯卡拉extends AnyRef with ScalaObject
每一個(用戶自定義)類無論是否包括明確。
聲明的以下幾組因此等價的:如果你改變的MySuperClass
,MyTrait1
和MyTrait2
順序
class MyClass { ... }
class MyClass extends AnyRef with ScalaObject { ... }
class MyClass extends MySuperClass { ... }
class MyClass extends MySuperClass with ScalaObject { ... }
class MyClass extends MyTrait1 with MyTrait2 { ... }
class MyClass extends AnyRef with MyTrait1 with MyTrait2 { ... }
class MyClass extends MySuperClass with MyTrait1 with MyTrait2 { ... }
最後一個例子是不一樣的。特別是,你不能把特質放在類的前面,如果它們都具有相同方法的實現,那麼堆棧特徵的順序就很重要。 (在這種情況下,最後一個「獲勝」)。
還請記住,在Scala中只有class
可以有參數,所以您將永遠只能將參數附加到extends
關鍵字之後的類型,永遠不會任何在with
之後列出的類型。
希望有幫助!
如果有多個class
ES或trait
s到繼承,第一種是始終extends
,並且以下> = 0 class
/trait
是with
秒。
但請記住,你只能繼承 < = 1(抽象)類,這意味着如果你需要繼承父類(Parent
),它應該總是在第一形式... extends Parent ...
,並沒有更多的類可以繼承到派生類。
trait T1
trait T2
class P1
class P2
class C1 extends T1
class C2 extends T1 with T2
class C3 extends T2 with T1
class C4 extends P1 with T1
/// class C5 extends T1 with P1 // invalid
/// class C6 extends P1 with P2 // invalid
with
實際上綁定到類/性狀即extend
版,例如,class C7 extends P1 with T1 with T2
讀取class C7 extends (P1 with T1 with T2)
。
注意,這僅僅是從語法的觀點出發,語義差異可以從以下被稱爲:
- 使用
trait
和(abstract
)class
是 here ; - 解析規則是所謂的 class linearization;有a post about it。
使用extends
關鍵字,您繼承的第一件事物可以是特質或類。
trait SomeTrait
class SomeClass
class ThisIsValid extends SomeTrait
class ThisAsWell extends SomeClass
您可以使用關鍵字with
進一步定義遺傳性狀(也是唯一的特徵)。
class AlsoThisWorks extends SomeClass with SomeTrait
如果一個特徵繼承自一個類,就不能像上面的例子那樣使用它。
這就是關於extends
和with
關鍵字。如果您想了解更多關於classes和traits的信息,官方文檔將深入討論該主題。
- 1. 斯卡拉類擴展{}
- 2. 斯卡拉擴展構造
- 3. 斯卡拉,擴展迭代器
- 4. 斯卡拉:特質擴展java.nio.file.FileVisitor
- 5. 斯卡拉案例類地圖擴展
- 6. 斯卡拉:擴展地圖和定義+
- 7. 擴展類斯卡拉 - 新手詢問
- 8. 斯卡拉的eta擴展是什麼?
- 9. 斯卡拉擴展雙箭頭
- 10. 斯卡拉OO-可選擴展特性
- 11. 斯卡拉 - 新的vs對象擴展
- 12. 斯卡拉類擴展與伴侶的宏擴展:類型未找到
- 13. 與斯卡拉
- 14. 與斯卡拉
- 15. 斯卡拉擴展列表類與合併preappend方法
- 16. 卡夫卡與斯卡拉
- 17. 與play2.5斯卡拉
- 18. 斯卡拉 - 與Iterator.toList
- 19. 阿卡與斯卡拉IDE
- 20. 斯卡拉
- 21. 在斯卡拉
- 22. 與擴展斯威夫特擴展
- 23. 在斯卡拉
- 24. 斯卡拉 - 對象擴展的抽象類和取參數
- 25. 爲什麼斯卡拉類需要明確地擴展AnyRef
- 26. 斯卡拉分歧implicit擴展編譯器錯誤
- 27. 斯卡拉錯誤:缺少擴展功能的參數類型
- 28. 斯卡拉功能,需要擴展類和特徵的類型
- 29. 斯卡拉比賽恰好類(不擴展)
- 30. Groovy的等效斯卡拉隱含參數 - 擴展
擴展是爲對象或類,而爲接口或特性 – HuntsMan
Martin Odersky爲這個http://www.scala-lang.org/old/node/10145.html寫了一個很好的答案 – raam86