Какие методы Scala Map переопределить

Я хочу создать структуру данных Counter[A] (на основе счетчика Python). ), который расширяет Map[A, Int], который просто ведет подсчет вхождений элементов типа A. Я хочу, чтобы у него было 2 дополнительных метода add(item: A) и remove(item: A), которые увеличивают/уменьшают счетчик, связанный с item, и, конечно, я также хочу, чтобы все хорошие методы сбора Scala, такие как map, filter и т. д., поэтому я, вероятно, должен расширить Map[A, Int]. Но я не понимаю, какой минимальный набор методов я должен переопределить/реализовать из Map, чтобы другие методы коллекции Scala просто работали.


person pathikrit    schedule 26.10.2013    source источник


Ответы (2)


Попробуйте заменить наследование делегированием. Другими словами, ваш класс может расширять Map[A, Int], но он должен содержать закрытый член Map[A, Int]. Все вызовы вашего класса просто делегируют те же вызовы члену.

Вот частичная реализация моего предложения:

class MyClass[A, Int] extends collection.immutable.Map[A, Int] {
  private val map = collection.immutable.Map.empty[A, Int]

  def get(key: A): Option[Int] = {
    map.get(key)
  }

  def iterator: Iterator[(A, Int)] = {
    map.iterator
  }

  def -(key: A): Map[A, Int] = {
    map - key
  }

  def +[B1 >: Int](kv: (A, B1)): Map[A, B1] = {
    map + kv
  }
}
person Vidya    schedule 26.10.2013
comment
Но тогда мне пришлось бы делегировать все 100 или около того методов в Map, верно? Я хочу переопределить наименьший набор методов... - person pathikrit; 27.10.2013
comment
Нет. Приведенный выше класс представляет собой минимум, который вам нужно реализовать. Итак, другой класс теперь может сказать val map = new MyMap[Int, Int]. Поскольку filter, например, является конкретным методом в признаке Map, вам не нужно его реализовывать. Но вызов его может сбить с толку клиентов своим поведением. Таким образом, вы можете использовать свою IDE для реализации всего с super, или вы можете не расширять свой класс Map. Надеюсь, другие присоединятся к другим лучшим решениям, поскольку я тоже все еще изучаю Scala. - person Vidya; 27.10.2013
comment
Я только что реализовал это здесь: github.com/pathikrit/scalgos/commit/ - person pathikrit; 28.10.2013

Вы должны посмотреть на это: http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html Подробно объясняет процесс создания новых коллекций в scala. Если вы не хотите читать всю статью, вы можете сразу перейти к разделу «Интеграция новых наборов и карт», в котором на примере показано, как создать новый тип карты — именно то, что вы хотите сделать.

person Piotr Kukielka    schedule 26.10.2013