给定 Scala 中的 Map[String, Int],我想创建一个特征,允许我向 add 和 get 方法添加额外的逻辑。这样做的正确语法是什么?(注意:我也想在每种情况下调用 super 方法)
我试过类似的东西:
var mymap: Map[String, Int] with mytrait[String, Int] = Map[String, Int]()
trait mytrait[A, B] {
abstract override def +[ B1 >: B] (kv: (A, B1)) : Map[A, B1] = { /* ... */ }
}
但是解释器抱怨所以我显然在语法上遗漏了一些东西,特别是在使用类型参数时。
非常感谢您的帮助
更具体地说:我所拥有的是我的代码中已经存在的映射,因此我不想重写我的程序的大块,而是想向 Map 的 + 方法和 get 方法添加逻辑,以便它执行额外的逻辑每次将项目添加到程序中其他地方的地图时。因此,为什么我选择了一个 trait 来为地图添加功能
这是我目前的代码:
trait RegManager[A, B] extends scala.collection.Map[A, B] {
case class KeyAlreadyExistsException(e: String) extends Exception(e)
abstract override def + [B1 >: B] (kv: (A, B1)): scala.collection.Map[A, B1] = {
super.+[B1](kv)
}
abstract override def get(key: A): Option[B] = super.get(key)
abstract override def iterator: Iterator[(A, B)] = super.iterator
abstract override def -(key: A): scala.collection.Map[A, B] = super.-(key)
}
var regs = new scala.collection.Map[String, Int] with RegManager[String, Int]
更新: 最后我选择了完成工作的包装器样式实现(装饰器 DP)。我的 Scala 职业生涯只有 6 个月,所以我可能还没有正确理解特征的能力?!不过语言很棒!