簡體   English   中英

Scala和OO:指定超類中的層級

[英]Scala and OO: Specifying heirachy levels in super class

可以說我正在創建超一流的Animalia。 它可能會有大量的子類:例如,智人,黑猩猩,哺乳動物不昆蟲等。現在,能夠在超類中指定子類級別非常有用:Phylum,Family,Genus,Species等然后,這將允許我們使用諸如self.Family.Typeself.Species.Type類的東西。 因此,人類的self.Genus.Type將為Homo,而self.Family.Type將為Hominadae。 這是我經常在自己的代碼中想要的東西。 我想使用自我類型,但不能,因為我無法在預期的繼承層次結構中指定級別。

這也可能使我們能夠做其他事情,例如指定不能在物種級別以上實例化類,或者必須在某些級別將某些成員定為最終成員。 因此,我們可能有val bool分化的組織,必須在Phylum水平下完成。 我們還可以指定物種不能直接從動物界繼承,而必須從屬繼承,而后者必須從科等繼承。

我以動物界為例,因為它易於理解的復雜層次結構。 因此,我對生物學不感興趣,但為了回應評論,動物界可能會:

class Animalia {
Type fundamentalCellType = Eucharyotic // All sub species inherit from this.
val HasDifferentiatedTissues: Boolean
}

目前有什么方法可以通過Scala做到這一點嗎? 如果沒有,那么在Scala,其他語言或面向對象的理論中是否有任何文章論文等對此進行討論? 我還沒有找到任何東西,但是我確定我不能成為第一個想要這種功能的人。

OO繼承建模比看起來簡單。 extends關鍵字是“是”關系的同義詞。 因此,“黑猩猩是靈長類動物,所有靈長類動物都是哺乳動物”是有意義的,因此可以將這種關系建模為:

trait Primate extends Mammal
class Chimp extends Primate

但是,“靈長類是命令”的關系不成立。 因此,您不能通過繼承對其進行建模。 但是,“主要訂單是訂單”是有意義的,您可以將這種關系建模為:

object Primates extends Order
object Mammals extends Klass

然后,您可以說“黑猩猩屬於PrimateOrder”,但這是不同的關系,您可以將其建模為:

trait Animal {
  def order: Order
  def klass: Klass
}
trait Mammal extends Animal {
  val klass = Mammals
}
trait Primate extends Mammal {
  val order = Primates
}
class Chimp extends Primate

chimp.order //=> Primates
chimp.klass //=> Mammals

您正在將繼承層次與事物的層次生物學分類混淆! 例如; 為什么Chimpanzee 成為Animalia 為什么一個物種門? 這些是不同的概念。

您真正要尋找的是聚合 (對我缺乏生物學正確性的道歉)

trait Animalia { def phyla: List[Phylum] }

那么我們可能有:

trait Family { def phylum: Phylum }
trait Genus { def family: Family }
trait Species { def genus: Genus }

並舉例說明:

object Primates extends Family { val phylum = Mammals }
object Apes extends Genus { val family = Primates }
object HomoSapiens extends Species { val genus = Apes }

回答的第一步可能看起來像這樣

class Animalia {
  Type FundamentalCellType = Eucharyotic // All sub species inherit from this.
  val HasDifferentiatedTissues: Boolean

  type PhylumT <: Animalia
  val phylum : PhylumT
  type KlassT <: phylum.type //Not sure if this would work.
  val klass: KlassT
  type GenusT <: klass.type  //intermediate classification left out for simplicity
  val genus: GenusT
}

暫無
暫無

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

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