返回派生类实例而不是基类实例

时间:2014-07-10 06:18:43

标签: c# generics polymorphism

我有一个看起来像这样的界面

 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;
    }
}

任何意见都将受到赞赏。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我相当确定你不能这样做,因为它会破坏类型系统。

考虑通常的动物示例:

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.

答案 1 :(得分:1)

不,你不能这样做。你的问题的简单版本将是给定的

class Base { }
class Derived : Base { }

是否可以使用IDictionary<T, Base> dict = new Dictionary<T, Derived>()

这是不可能的,因为C#的协方差规则不允许这样做。并且有充分的理由,因为如果它可以工作,那么您只需将Base类型的对象添加到应该只接受Derived个对象的字典中。