加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 当在特质中扩展特征时,“超级”是指什么?

发布时间:2020-12-16 09:19:27 所属栏目:安全 来源:网络整理
导读:我想在一个特质中扩展一个特质,像这样: trait NodeTypes { trait Node { def allNodesHaveThis: Int } } trait ScrumptiousTypes extends NodeTypes { trait Node extends super.Node { def scrumptiousness: Int } } trait YummyTypes extends NodeTypes {
我想在一个特质中扩展一个特质,像这样:

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
    }
  }

如果这样工作,这将是一个很好的方式,说“当你的图继承自< Whatever>类型时,它的Node类必须提供< Whatever>所需的方法.

但Scala 2.11.2编译器说:

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

看起来,YummyTypes.Node阴影ScrumptiousTypes.Node,遵循Scala解决方法的“钻石”继承的通常方式:按类型线性化.据了解,事实上,这应该是可以的,因为YummyTypes.Node明确地扩展了super.Node,通过相同的类型线性化,应该引用ScrumptiousTypes.

我有什么误解?或者,super.Node是什么引用的,为什么?

如果你想知道为什么我这样做,那么我可以一次将变化组合成几个特征,所以继承的特征是互操作的,如this question中所述.在最后的Node类(和其它类一起工作)中,我不想明确地从每个节点特征扩展:我想从一个“东西”(无论是什么)混合,并且获得与Node和所有其他特征的所有相互一致的更改.或者,如果一个特征定义了一些对Node的扩展,从ScrumptiousTypes扩展应该使所有的Node-extensions都包含一个scrumptiousness成员,而不必列出所有的Node-extensions:trait Hypernode extends ScrumptiousTypes.Node,trait ZealousNode extends ScrumptiousTypes .Node等

解决方法

使用类型也解决了这个问题

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
  }

}

—— 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
  }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读