刚才调试了一个程序问题,发现在继承方面有个现象比较好玩,
程序是这样的:
1。我有一个类DictionaryExt<TKey,TValue>:Dictionary<TKey,TValue>
2。另外,我改写了一个方法ContainsKey(Key)
public class DictionaryExt<TValue> : DictionaryExt<string, TValue>
{
public new bool ContainsKey(string key)
{
return base.ContainsKey(key.ToLower());
}
}
3。在一个程序中,
publish void 设置值()
{
DictionaryExt<string, object> dict=new DictionaryExt<string, object>();
dict.Add("abc",100);
SetValue( (IDictionary<string, object>)dict);
}
private static void SetValue( IDictionary<string, object> dict)
{
string myKey="ABC";
// 传入的dict参数有一个记录是:
//dict["abc"]=100;
i
if (dict.ContainsKey(myKey)) //关键:判断是否存在
{
messageBox.Show("OK");
}
else
{messageBox.Show("Not Found");}
}
奇怪的现象是, 判断语句始终都是返回false的。
解决方法:
把1。类的继承方式修改了一下:
public class DictionaryExt<TValue> : DictionaryExt<string, TValue>,IDictionaryExt<string, TValue>
{
public new bool ContainsKey(string key)
{
return base.ContainsKey(key.ToLower());
}
}
然后再运行,程序就没有问题了。
-------------------------------------------
问题总结: 估计是在继承中,调用程序是IDictionary,而自定义类DictionaryExt没有直接继承IDictionary接口,而Dictionary直接继承了IDictionary,所以,在调用时,只会调用Dictionary的方法,而不会调用DictionaryExt的同名方法。
而后来,让DictionaryExt也直接继承IDictionary接口,所以,系统直接先找DictionaryExt的方法执行,而不会直接找基类Dictionary 的方法了。
所以,这种情况是需要小心 处理。