簡體   English   中英

Scala抽象繼承

[英]Scala abstract inheritance

所以,我想要做的是使用traits創建一個抽象的繼承模型。 我認為示例代碼效果最好所以我創建了這個小展示來展示我的問題。

trait Animals{
 val owned: Seq[Animal]
 type Animal <: TAnimal
 trait TAnimal {
  def name : String
 }
}

到現在為止還挺好。 現在我有另一個特點“狗”。 狗被切碎,所以他們有和識別號碼。 此外,我想實現包含我所有狗的序列(假設我有5只隨機名稱的狗和隨機的identNo,為了簡單起見)。

trait Dogs extends Animals{
 type Dog <: TDog
 val owned = ???
 trait TDog extends TAnimal {
  def identNo : Int
 }
}

問題是,由於Animal或Dog只是類型,我無法創建它們的具體實例。 我想我可以使用像Seq.fill這樣的東西,但是我無法創建匹配的表達式。

這稱為蛋糕模式。 而且您不需要在Dog trait中編寫所有這些內容,您可以像這樣定義它:

trait Animals{
 type Animal <: TAnimal
 def owned: Seq[Animal]
 trait TAnimal {
  def name : String
 }
}

trait Dogs extends Animals{
 type Animal <: TDog
 trait TDog extends TAnimal {
  def identNo : Int
 }
}

然后“在世界末日”你用一些具體的實施方式組裝你的蛋糕:

trait ReservoirDogs extends Dogs {
  case class Animal(name: String, identNo: Int) extends TDog
  val owned = List(Animal("Pink", 1), Animal("Blue", 2))
}

現在你可以把它混合在一起:

scala> val dogs = new Dogs with ReservoirDogs {}
dogs: Dogs with ReservoirDogs = $anon$1@6f6f6727

scala> val dogs = new Animals with ReservoirDogs {}
dogs: Animals with ReservoirDogs = $anon$1@11c8ce34

這就是Cake Pattern的意義所在

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM