ScalaでMap[String、Int]が与えられた場合、addメソッドとgetメソッドにロジックを追加できるようにするトレイトを作成したいと思います。これを行うための正しい構文は何でしょうか?(注:それぞれの場合にスーパーメソッドも呼び出したいです)
私は次のようなことを試しました:
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)を選びました。私はScalaのキャリアを始めてまだ6か月なので、特性の機能をまだ正しく理解していない可能性がありますか?!でも素晴らしい言語です!