如何从它

时间:2017-01-24 18:13:14

标签: c# dictionary inheritance idictionary

我的目标是拥有一个具有唯一键值的字典,我将使用其他HashSet解决这些问题。我希望有一个基类,更多特定类型可以从中继承。

据我所知,字典类的add-Method不是虚拟的,因此无法覆盖。所以唯一的方法就是实现IDictionary接口。

因此我的基本字典类的基本结构是:

public class BaseCustomDictionary<TKey,TValue>:IDictionary<TKey,TValue> {
    public virtual Dictionary<TKey,TValue> InternalDict {
        get;
        set;
    }

    public BaseCustomDictionary() {
        this.InternalDict = new Dictionary<TKey,TValue>();
    }

    // Here I start implementing all the required methods, e.g. Add, TryGetValue
    public virtual void Add(TKey key, TValue value) {
        InternalDict.Add( key, value );
    }

    public bool TryGetValue (TKey key, out string value) {
        return InternalDict.TryGetValue (key, out value);
    }

    // And so on and so forth
}

现在我想要一个具有int s作为键和string作为值的具体子类:

public class IntStringDictionary<TKey,TValue>:BaseCustomDictionary<TKey,TValue> {
    public override Dictionary<int,string> InternalDict {
        get;
        set;
    }

    HashSet<string> UniqueValues;

    public IntStringDictionary() {
        InternalDict = new Dictionary<int,string>();
        UniqueValues = new HashSet<string>();
    }

    public override void Add (TKey key, TValue value) {
        if (InternalDict.ContainsKey (key)) {
            return;
        }

        string randomStr = RandomString();

        if (!UniqueValues.Add(randomStr)) {
            Add(key,value);
            return;
        } else {
            InternalDict.Add(key,randomStr);
            return
        }
    }
}

在这里,我遇到各种各样的问题。 第一个是The best overloaded method match for 'System.Collections.Generic.Dictionary<int,string>.ContainsKey(string) has some invalid arguments'. Cannot convert type 'TKey' to 'string'.同意。因此,我将InternalDict更改为new Dictionary<TKey,short>(),将Add的参数更改为(TKey key, TValue value)

下一个问题是如何访问方法。说我的实现如下:

public static IntStringDictionary<int,string> myDict = new IntStringDictionary<int,string>();

// Assuming the class is named Constructor
public Constructor() {
    myDict.Add(1,"foobar");
}

public static string GetValue (int key) {
    string value;
    myDict.TryGetValue(key, out value);

    if (value == '') {
        throw new NullReferenceException ("Value not found for given key");
    }

    return value;
}

如果我通过GetValue,这个1方法总会抛出已实现的异常,而我并不真正理解为什么。我调试了代码并且可以告诉他们&#39; InternalDict&#39;事实上确实持有密钥1和值foobar. The TryGetValue call on myDict jumps into the implementation of the BaseCustomDictionary class and writes an empty string into the value`变量。

当然,我现在可以在我的子类中实现自己的TryGetValue,但是如果我必须实现每个方法,这似乎会破坏子类的目的。

public bool TryGetValue(TKey key, out int value) {
    return InternalDict.TryGetValue(key, out value);
}

我觉得我在继承方面做了一些根本性的错误。

2 个答案:

答案 0 :(得分:0)

子类没有理由是通用的;它的原因是为其基类指定类型参数。像这样声明子类:

public class IntStringDictionary : BaseCustomDictionary<int,String> 
{
}

如果您的基类不是抽象的,那么您不需要为此实现任何成员。事实上,我不清楚为什么你不仅仅像BaseCustomDictionary<int, String>一样实例化Dictionary,但是有正当理由可以将子类与你的问题无关。

顺便说一下,通用基础中的这个不会编译:

public bool TryGetValue (TKey key, out string value) {
    return InternalDict.TryGetValue (key, out value);
}

这将 - value参数需要为TValue。但我猜这只是在撰写你的问题时的复制和粘贴错误。

public bool TryGetValue (TKey key, out TValue value) {
    return InternalDict.TryGetValue (key, out value);
}

答案 1 :(得分:0)

你这样做错了:

public class IntStringDictionary:BaseCustomDictionary

要创建与BaseCustomDictionary具有相同功能的int字符串字典,继承。你这样做:

var myDict = new BaseCustomDictionary<int, string>();

这很简单!

只有在想要向BaseCustomDictionary添加新功能时才会继承。根据您的问题,我无法看到您要添加到BaseCustomDictionary的新行为。