2013-10-26 3 views
1

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

ответ

4

Рассмотрите возможность замены наследования делегированием. Другими словами, ваш класс может распространяться на 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 
    } 
} 
+0

Но тогда мне пришлось бы делегировать все 100 или около того методов в Карте? Я хочу переопределить самый маленький набор методов ... – pathikrit

+0

№ Класс, который я изложил выше, представляет собой минимум, который вы должны реализовать. Таким образом, еще один класс теперь может сказать «val map = new MyMap [Int, Int]». Поскольку, например, 'filter' является конкретным методом в признаке« Карта », вам не нужно его реализовывать. Но вызов его может смутить клиентов своим поведением. Таким образом, вы могли бы использовать свою среду IDE для реализации всего с помощью 'super', иначе вы могли бы не расширять ваш класс« Map ». Надеюсь, что другие будут перекликаться с другими лучшими решениями, поскольку я тоже все еще изучаю Scala. – Vidya

+0

Я только что внедрил его здесь: https://github.com/pathikrit/scalgos/commit/597baeb406d92c179e919faff3c3fe1d8141193e – pathikrit

1

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

Смежные вопросы