Я хочу создать структуру данных Counter[A]
(на основе счетчика Python). ), который расширяет Map[A, Int]
, который просто ведет подсчет вхождений элементов типа A
. Я хочу, чтобы у него было 2 дополнительных метода add(item: A)
и remove(item: A)
, которые увеличивают/уменьшают счетчик, связанный с item
, и, конечно, я также хочу, чтобы все хорошие методы сбора Scala, такие как map
, filter
и т. д., поэтому я, вероятно, должен расширить Map[A, Int]
. Но я не понимаю, какой минимальный набор методов я должен переопределить/реализовать из Map
, чтобы другие методы коллекции Scala просто работали.
Какие методы Scala Map переопределить
Ответы (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
Но тогда мне пришлось бы делегировать все 100 или около того методов в Map, верно? Я хочу переопределить наименьший набор методов...
- person pathikrit; 27.10.2013
Нет. Приведенный выше класс представляет собой минимум, который вам нужно реализовать. Итак, другой класс теперь может сказать
val map = new MyMap[Int, Int]
. Поскольку filter
, например, является конкретным методом в признаке Map
, вам не нужно его реализовывать. Но вызов его может сбить с толку клиентов своим поведением. Таким образом, вы можете использовать свою IDE для реализации всего с super
, или вы можете не расширять свой класс Map
. Надеюсь, другие присоединятся к другим лучшим решениям, поскольку я тоже все еще изучаю Scala.
- person Vidya; 27.10.2013
Я только что реализовал это здесь: 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