[英]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.