继承问题

时间:2011-09-05 11:40:21

标签: java inheritance

我实施了以下内容:

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 个答案:

答案 0 :(得分:1)

  

我对自己的所作所为感到不对

你说感觉还不错,这是不对的。 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>)。然后你必须实现它,这作为读者的练习......(如果你希望用户为每个值提供标签,可能无法实现)

答案 1 :(得分:0)

TaggedMultiMap是否应该为每个条目都有一个标签?如果是,则可以轻易违反此前提条件 - 您可以使用MultiMap界面在TaggedMultiMap中插入没有标记的条目。

答案 2 :(得分:0)

如果你真的必须使用这种类层次结构,那么你应该在TaggedMultiMapClass中覆盖put方法,如下所示:

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

这样可以防止向地图添加未标记的值。