让我们说我正在创造一个超级级的动物界。它可能会有大量的子类:例如Homo Sapien,Chimpanzee Chordata,Mammal Insecta等。现在能够在超类中指定子类级别真的很有用:门,家族,属,物种等这将允许我们使用self.Family.Type
或self.Species.Type
之类的东西。所以self.Genus.Type类型的人类将是Homo和self.Family.Type将是Hominadae。这是我经常在自己的代码中发现自己想要的东西。我想使用self类型,但我不能,因为我无法在预期的继承层次结构中指定级别。
这可能还允许我们做其他事情,例如指定一个类无法在物种级别上实例化,或者某些成员必须在某些级别上成为最终成员。所以我们可能有val bool分化组织,必须在Phylum水平确定。我们还可以指定一个物种不能直接从动物园继承,而是从一个家族等继承的Genus继承。
我刚刚以动物园为例,因为它是一个易于理解的复杂层次结构。所以我对生物学不感兴趣,但在回应评论时,Animalia可能会:
class Animalia {
Type fundamentalCellType = Eucharyotic // All sub species inherit from this.
val HasDifferentiatedTissues: Boolean
}
Scala目前有没有办法解决这个问题?如果不存在任何文章论文等在Scala,其他语言或一般在OO理论中讨论这个问题?我找不到任何东西,但我确信我不能成为第一个拥有的人想要这样的功能。
答案 0 :(得分:2)
OO继承建模比看起来简单。 extends
关键字是“is-a”关系的同义词。因此,“黑猩猩是灵长类动物,所有灵长类动物都是哺乳动物”是有意义的,所以你可以建模这种关系:
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
答案 1 :(得分:1)
您将继承层次结构与事物的层次生物分类混淆!例如;为什么Chimpanzee
<{1}}?为什么一个物种是一个门?这些是截然不同的概念。
你真正想要的是聚合(为我缺乏生物学正确性道歉)
Animalia
然后我们可能会:
trait Animalia { def phyla: List[Phylum] }
这是一个例子:
trait Family { def phylum: Phylum }
trait Genus { def family: Family }
trait Species { def genus: Genus }
答案 2 :(得分:0)
答案的第一步可能看起来像这样
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
}