在特征中扩展特征时,"超级"指的是什么?

Ben*_*itz 15 scala traits super mixins inner-classes

我想在一个特征中扩展一个特征,如下所示:

  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
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果这样做,那将是一种很好的说法,"当你的Graph继承<Whatever>Types,它的Node类必须提供所需的方法<Whatever>."

但是Scala 2.11.2编译器说:

error: method scrumptiousness overrides nothing
      override def scrumptiousness = 2
                   ^
Run Code Online (Sandbox Code Playgroud)

它似乎是YummyTypes.Node阴影ScrumptiousTypes.Node,遵循Scala解决方法的"钻石"继承的通常方式:通过类型线性化.正如我理解的那样,那应该没问题,因为YummyTypes.Node显式扩展super.Node,通过相同类型的线性化应该引用ScrumptiousTypes.

我误解了什么?或者,什么super.Node指的是 - 为什么?


如果你想知道为什么我这样做,那么我可以同时将变化混合到几个特征中,所以继承的特征可以互操作,如本问题所述.在最后的Node类(以及它使用的其他类)中,我不希望从每个Node特征显式扩展:我想从一个"东西"(无论它是什么)混合并得到所有相互一致的变化制作Node和其他特征,都在捆绑中.或者,如果一个特征定义了一组扩展节点,从ScrumptiousTypes延长应使所有节点的扩展包含的scrumptiousness成员,而不必列出所有节点的扩展:trait Hypernode extends ScrumptiousTypes.Node,trait ZealousNode extends ScrumptiousTypes.Node,等.

余杰水*_*余杰水 5

使用类型也解决了问题

trait NodeTypes {

  trait Node {
    def allNodesHaveThis: Int
  }

}

trait ScrumptiousTypes extends NodeTypes {

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

  type ScrumptiousTypesNode = this.Node
}

trait YummyTypes extends NodeTypes {

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

  type YummyTypesNode = this.Node
}

object Graph extends NodeTypes with ScrumptiousTypes with YummyTypes {

  case class Node() extends ScrumptiousTypesNode with YummyTypesNode {
    override def allNodesHaveThis = 1

    override def scrumptiousness = 2

    override def yumminess = 3
  }

}
Run Code Online (Sandbox Code Playgroud)

------ v2 -------使用对象包含到Node,但是因为路径依赖它不是一个好主意,也许它会是问题

trait NodeTypes {

  trait Node {
    def allNodesHaveThis: Int
  }

}

object NodeTypes extends NodeTypes

trait ScrumptiousTypes extends NodeTypes {

  trait Node {
    def scrumptiousness: Int
  }

  type ScrumptiousTypesNode = this.Node
}

object ScrumptiousTypes extends ScrumptiousTypes

trait YummyTypes extends NodeTypes {

  trait Node {
    def yumminess: Int
  }

  type YummyTypesNode = this.Node
}

object YummyTypes extends YummyTypes

trait Nodes {

  trait Nodes extends NodeTypes.Node with  YummyTypes.Node with ScrumptiousTypes.Node

}


object Graph extends  Nodes {

  case class Nodes() extends super.Nodes {
    override def yumminess: Int = 1
//
    override def scrumptiousness: Int = 2

    override def allNodesHaveThis: Int = 3
  }

}
Run Code Online (Sandbox Code Playgroud)