2016-12-08 156 views
14

我越來越迷惑。我在我現有的項目中找到了。一些地方extends和一些地方with。我無法找到不同的人,請你幫助我。斯卡拉 - 擴展與

+0

擴展是爲對象或類,而爲接口或特性 – HuntsMan

+3

Martin Odersky爲這個http://www.scala-lang.org/old/node/10145.html寫了一個很好的答案 – raam86

回答

10

在斯卡拉,您可以繼承class es(具體或abstract)和trait s。類似於只能擴展一個類的方法,但在Java中實現儘可能多的接口,只允許從一個class繼承,但只能繼承一個trait

如果要擴展class,該類應該緊跟在extends關鍵字後面。任何你要延伸的trait都應遵循,由with關鍵字隔開。

如果您不擴展課程,則可以將第一個trait放在extends關鍵字的後面,並在此之後繼續。

正如在Java中,每類是Object一個子類,你是否顯式聲明與否,在斯卡拉extends AnyRef with ScalaObject每一個(用戶自定義)類無論是否包括明確。

聲明的以下幾組因此等價的:如果你改變的MySuperClassMyTrait1MyTrait2順序

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之後列出的類型。

希望有幫助!

13

如果有多個class ES或trait s到繼承,第一種是始終extends,並且以下> = 0 class/traitwith秒。

但請記住,你只能繼承 < = 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)

注意,這僅僅是從語法的觀點出發,語義差異可以從以下被稱爲:

  1. 使用trait和(abstractclasshere ;
  2. 解析規則是所謂的 class linearization;有a post about it
2

使用extends關鍵字,您繼承的第一件事物可以是特質或類。

trait SomeTrait 
class SomeClass 

class ThisIsValid extends SomeTrait 
class ThisAsWell extends SomeClass 

您可以使用關鍵字with進一步定義遺傳性狀(也是唯一的特徵)。

class AlsoThisWorks extends SomeClass with SomeTrait 

如果一個特徵繼承自一個類,就不能像上面的例子那樣使用它。

這就是關於extendswith關鍵字。如果您想了解更多關於classestraits的信息,官方文檔將深入討論該主題。