Wenn ein Merkmal innerhalb eines Merkmals erweitert wird, worauf bezieht sich "Super"?

Ich möchte ein Merkmal innerhalb eines Merkmals wie folgt erweitern:

  trait NodeTypes {
    trait Node {
      def allNodesHaveThis: Int
    }
  }

  trait ScrumptiousTypes extends NodeTypes {
    trait Node extends super.Node {
      def scrumptiousness: Int
    }
  }

  trait YummyTypes extends NodeTypes {
    trait Node extends super.Node {
      def yumminess: Int
    }
  }

  object Graph extends NodeTypes with ScrumptiousTypes with YummyTypes {
    case class Node() extends super.Node {
      override def allNodesHaveThis = 1
      override def scrumptiousness = 2  // error: ScrumptiousTypes.Node has been disinherited
      override def yumminess = 3
    }
  }

Wenn dies funktioniert, wäre es eine nette Art zu sagen: „Wenn deinGraph erbt von<Whatever>Types, es istNode class muss die von @ benötigten Methoden bereitstell<Whatever>. ”

Aber der Scala 2.11.2-Compiler sagt:

error: method scrumptiousness overrides nothing
      override def scrumptiousness = 2
                   ^

AnscheinendYummyTypes.Node SchattenScrumptiousTypes.Node, nach der üblichen Methode, mit der Scala die Diamantvererbung für Methoden auflöst: durch Typlinearisierung. Wie ich Dinge verstehe, dasssollt OK sein, dennYummyTypes.Node erweitert explizitsuper.Node, das sich bei der Linearisierung desselben Typs auf @ beziehen sollScrumptiousTypes.

Was habe ich falsch verstanden? Oder was bedeutetsuper.Node siehe - und warum?

Wenn Sie sich fragen, warum ich das mache, kann ich Änderungen auf einmal in mehrere Merkmale mischen, damit die vererbten Merkmale zusammenwirken, wie in @ erläuterdiese Frag. In der letzten Knotenklasse (und in anderen Klassen, mit denen es funktioniert) möchte ich nicht explizit von jeder Knoteneigenschaft ausgehen: Ich möchte von einer "Sache" (was auch immer es ist) aus mischen und alle gegenseitig konsistenten Änderungen erhalten gemacht, um Node und die anderen Eigenschaften, alle in einem Bündel. Wenn ein Merkmal eine Reihe von Erweiterungen für Node definiert, sollte die Erweiterung von ScrumptiousTypes alle Node-Erweiterungen mit einem @ versehescrumptiousness member, ohne alle Node-Extensions auflisten zu müssen:trait Hypernode extends ScrumptiousTypes.Node, trait ZealousNode extends ScrumptiousTypes.Node, etc

Antworten auf die Frage(6)

Ihre Antwort auf die Frage