0

假设我正在创建一个超类 Animalia。它可能有大量的子类:例如智人、黑猩猩脊索动物、哺乳动物昆虫等。现在能够在超类中指定子类级别非常有用:门、科、属、物种等. 这将允许我们使用类似self.Family.Type or的东西self.Species.Type。因此,人类的 self.Genus.Type 将是 Homo,而 self.Family.Type 将是 Hominadae。这是我经常发现自己在自己的代码中想要的东西。我想使用 self 类型,但我不能,因为我无法在预期的继承层次结构中指定级别。

这可能还允许我们做其他事情,例如指定一个类不能在物种级别之上实例化,或者某些成员必须在某些级别成为最终的。所以我们可能有 val bool 分化的组织,必须在 Phylum 级别完成。我们还可以指定一个物种不能直接从 Animalia 继承,而是从一个 Genus 继承,该 Genus 必须从一个 Family 等继承。

我刚刚以 Animalia 为例,因为它是一个易于理解的复杂层次结构。所以我对生物学不感兴趣,但作为对评论的回应,动物界可能有:

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

目前有什么方法可以用 Scala 做这些吗?如果没有,是否有任何文章论文等在 Scala、其他语言或一般 OO 理论中讨论这个问题?我什么都没找到,但我敢肯定我不会是第一个想要这种功能的人。

4

3 回答 3

2

OO 继承建模比看起来要简单。extends关键字是“is-a”关系的同义词。因此,“黑猩猩是灵长类动物,所有灵长类动物都是哺乳动物”是有意义的,因此您可以将这种关系建模为:

trait Primate extends Mammal
class Chimp extends Primate

但是“灵长类动物是一种秩序”的关系并不成立。所以你不能通过继承来建模它。但是,“Primate order is an Order”是有意义的,您可以将此关系建模为:

object Primates extends Order
object Mammals extends Klass

然后您可以说“Chimp 属于 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
于 2012-06-21T13:18:54.233 回答
1

您将继承层次结构与事物的层次生物分类混淆了!例如; 为什么会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 }
于 2012-06-21T12:47:53.007 回答
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
}
于 2012-06-21T13:59:27.537 回答