簡體   English   中英

返回派生類實例而不是基類實例

[英]Return derived class instance instead of base class instance

我有一個看起來像這樣的界面

 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>>.類型的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對象的字典中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM