我的目标是拥有一个具有唯一键和值的字典,我将使用其他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);
}
我觉得我在继承方面做了一些根本性的错误。
答案 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
的新行为。