返回派生类实例而不是基类实例
本文关键字:实例 基类 返回 派生 | 更新日期: 2023-09-27 18:12:11
我有一个看起来像这样的界面
public interface SomeInterface<T, U>
where T : struct
where U : class
{
void Method1();
IDictionary<T, BaseClassItem<U>> GetDictionary();
}
我有一个这样的实现
public class LruEvictor<T, U> : SomeInterface<T, U>
where T : struct
where U : class
{
private Dictionary<T, BaseClassItem<U>> _dictionary;
public void Evict()
{
}
public IDictionary<T, BaseClassItem<U>> GetDictionary()
{
_dictionary = new Dictionary<T, BaseClassItem<U>>();
return _dictionary;
}
}
在上面的GetDictionary()方法中,我想返回一个的字典类型Dictionary<T, DerivedItem<U>>.
这可能吗?如果是,我该怎么做呢?
下面给出了派生类的实现。
public class DerivedItem<U> : BaseClassItem<U>
where U : class
{
public DerivedItem(U value) :base(value)
{
}
public DateTime LastAccessed { get; private set; }
public override void OnAccessed()
{
LastAccessed = DateTime.Now;
}
}
如有任何意见,不胜感激。
我很确定你不能这样做,因为这会破坏类型系统。
考虑通常的动物例子:
public IDictionary<T, Animal> GetDictionary()
{
_dictionary = new Dictionary<T, Llama>();
return _dictionary; // Imagine you can do this
}
IDictionary<T, Animal> dict = GetDictionary();
dict.Add(MakeT(), new Horse()); // Ouch.
不,你不能那样做。你的问题的一个简单版本是给定
class Base { }
class Derived : Base { }
是否可以使用IDictionary<T, Base> dict = new Dictionary<T, Derived>()
。
这是不可能的,因为c#的协方差规则不允许这样。并且有很好的理由,因为如果它可以工作,那么您可以简单地将类型为Base
的对象添加到应该只接受Derived
对象的字典中。