0

スーパークラスのアニマリアを作成しているとしましょう。膨大な量のサブクラスが存在する可能性があります。たとえば、ホモサピエン、チンパンジー脊索動物門、哺乳類昆虫などです。これで、スーパークラスのサブクラスレベル(門、家族、属、種など)を指定できると非常に便利です。 。これにより、self.Family.Type またはのようなものを使用できるようになりますself.Species.Type。したがって、self.Genus.Typeの人間はHomoになり、self.Family.TypeはHominadaeになります。これは、私が自分のコードで頻繁に望んでいることです。自己型を使用したいのですが、意図した継承階層内のレベルを指定する方法がないため、使用できません。

これにより、クラスを種レベルより上でインスタンス化できないことや、特定のメンバーを特定のレベルで最終化する必要があることを指定するなど、他のこともできる可能性があります。したがって、val boolで分化した組織がある可能性があり、門レベルで確定する必要があります。また、種が動物界から直接継承することはできず、属から継承することもできます。属は、家族などから継承する必要があります。

簡単に理解できる複雑な階層であるため、例としてアニマリアを使用しました。だから私は生物学には興味がありませんが、コメントに応えて、Animaliaは以下を持っているかもしれません:

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

現在、Scalaでこれを行う方法はありますか?そうでない場合は、Scala内、他の言語、または一般的にOO理論でこれについて説明している論文などがありますか?私は何も見つけることができませんでしたが、私はそのような機能を望んでいた最初の人になることはできないと確信しています。

4

3 に答える 3

2

オブジェクト指向の継承モデリングは、見た目より単純です。extendsキーワードは「is-a」関係の同義語です。したがって、「チンパンジーは霊長類であり、すべての霊長類は哺乳類です」は意味があるため、この関係を次のようにモデル化できます。

trait Primate extends Mammal
class Chimp extends Primate

しかし、「霊長類は目である」という関係は成立しません。したがって、継承によってモデル化することはできません。ただし、「霊長類は目である」には意味があり、この関係を次のようにモデル化できます。

object Primates extends Order
object Mammals extends Klass

次に、「チンパンジーは霊長類に属している」と言うことができますが、それは別の関係であり、次のようにモデル化できます。

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 に答える