Проблемы наследования - PullRequest
       5

Проблемы наследования

1 голос
/ 05 сентября 2011

Я реализовал следующее:

public class MultiMapClass<K,V> implements MultiMap<K,V> {

    private Map<K, TreeSet<V>> multiMap= new HashMap<K,TreeSet<V>>();


    public MultiMapClass(){

}

public void put(K key, V value){
    multiMap.get(key).add(value);
}

public Set<V> get(K key){
    return multiMap.get(key);
}
}


public class TaggedMultiMapClass<K,T,V>  extends MultiMapClass<K,V> implements TaggedMultiMap<K, V, T> {

private Map<K,HashMap<V,T>> tags = new HashMap<K,HashMap<V,T>>();

public TaggedMultiMapClass(){


}

@Override
public void put(K key, V value, T tag) {
    tags.get(key).put(value,tag);



}

@Override
public T getTag(K key, V val) {
 return tags.get(key).get(val);
}

@Override
public T getTag(TaggedMultiMap.Entry<K, V> entry) {
    return tags.get(entry.getKey()).get(entry.getValue());
}

@Override
public Set<T> getTags(K key) {
    return (Set<T>) tags.get(key).values(); }

}

Taggedmultimap, предположим, будет мультикарта , но я просто не чувствую, что сделал.Похоже, у меня просто есть два разных класса с двумя разными представлениями и вообще без связи.Если я решу, что один объект расширяется от другого, должен ли другой использовать некоторые методы первого?Я не могу выполнить функцию тегов (каждое значение набора значений должно иметь свой тег) с использованием Map<K, TreeSet<V>> multiMap= new HashMap<K,TreeSet<V>>(), и мне не нужно Map<K,HashMap<V,T>> tags = new HashMap<K,HashMap<V,T>>(); для использования мультикарты.Что мне делать?

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Я просто не чувствую себя правильно из-за того, что я сделал

Вы правы, что не чувствуете себя хорошо, это не хорошо. Imgaine, что происходит, когда вы делаете

TaggedMultiMap<K, V, T> tmm;
((MultiMap<K,V>)tmm).get(someK); // note you don't override get in TMM
                                 // also note the two get methods of MMC and TMM inspect different maps

((MultiMap<K,V>)tmm).set(someK, someV); // what would the tag be?

и т.д.

Если я решу, что один объект простирается от другого, должен ли другой использовать некоторые методы первого?

В идеале, он должен использовать ВСЕ его.

Канонический способ правильного использования наследования - это наследование от интерфейсов, которое будет MultiMap<K, V> (в отличие от MultiMapClass<K, V>). Затем вы должны реализовать его, который оставлен в качестве упражнения для читателя ... (может быть невозможно реализовать, если вы хотите, чтобы пользователь предоставлял теги для каждого значения)

0 голосов
/ 05 сентября 2011

Если вам действительно нужно следовать иерархии классов такого типа, вам следует переопределить метод put в TaggedMultiMapClass следующим образом:

@Override
public void put(K key, V value) {
    throw new UnsupportedOperationException();
}

Таким образом вы предотвратите добавление непомеченных значений на карту.

0 голосов
/ 05 сентября 2011

Должен ли TaggedMultiMap иметь тег для каждой записи? Если да, то это предварительное условие может быть легко нарушено - вы можете использовать интерфейс MultiMap для вставки записи без тега в TaggedMultiMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...