在Scala中给定一个Map [String,Int],我想创建一个特征,允许我为add和get方法添加额外的逻辑。这样做的正确语法是什么? (注:我也想调用在每种情况下的超法)覆盖Scala地图的特征添加方法
我想是这样的:
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的方法,以便每次将项目添加到程序中其他位置的地图时,它都会执行额外的逻辑。因此,为什么我选择了性状功能添加到地图
这里是我的代码目前:
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)完成了工作。我对斯卡拉的职业生涯只有6个月,所以我可能还没有正确理解特质的能力呢?!伟大的语言虽然!
请告诉我们你是如何实例化地图。 – 2012-08-07 11:04:23
您的最后一段听起来好像您想要更改单个已存在的对象的行为。你不能用特质来做到这一点,但你可以用对象的包装来做到这一点。但是,如果其他组件直接引用wrappee,那么它们将绕过您的包装。看看http://stackoverflow.com/questions/1913591/understanding-why-pimp-my-library-was-defined-that-way-in-scala和http://www.artima.com/weblogs /viewpost.jsp?thread=275135和https://github.com/kevinwright/Autoproxy-Lite – 2012-08-07 11:09:11
首先编译器抱怨+不覆盖任何东西。尝试删除+或扩展具有+功能的类。 – 2012-08-07 11:15:10