2017-07-17 38 views
0

我已經創建了兩個抽象類:BaseSetBaseItem這是父母爲ConcreteSet錯誤類型ConcreteSet必須轉換爲BaseSet <BaseItem>

public class BaseItem { } 
public class ConcreteItem { } : BaseItem 
public class BaseSet<T> where T : BaseItem { } 
public class ConcreteSet : BaseSet<ConcreteItem> { } 

現在我已經創建經理具有動態類型的BaseSet<BaseItem>

public abstract class BaseSetManager<T> : PersistentSingleton<BaseSetManager<T>> 
where T : BaseSet<BaseItem> 

接下來,當我嘗試派生出該經理時:

public sealed class ConcreteSetManager : BaseSetManager<ConcreteSet> 

我得到休耕錯誤The type 'ConcreteSet' must be convertible to 'BaseSet<BaseItem>' in order to use it as parameter 'T' in generic class 'BaseSetManager'

有什麼辦法讓抽象這樣的,還是我不得不放棄的對抽象和移動回基地一般類型。

我使用Unity3D不支持我的協方差(C#3.0)

+0

你約困惑,爲什麼'ConcreteSet'(這是一個'BaseSet ')是不可轉讓預計有哪些BaseSet ?這是因爲'BaseSet'不是協變的。 –

+0

那麼有什麼方法可以使'BaseSet'協變? –

+0

是的,你可以從'BaseSet'提取一個接口,並在這個接口中標記參數'T'作爲協變。當然,這假定你實際上使用「T」,即在「讀取」位置。 –

回答

2

的唯一辦法,現在因爲我僅限於C#3是BaseSetManager使用多種類型。更好的想法仍然感激。

public abstract class BaseSetManager<T, P> : PersistentSingleton<BaseSetManager<T, P>> 
where T : BaseSet<P> 
where P : BaseItem 

public sealed class ConcreteSetManager : BaseSetManager<ConcreteSet, ConcreteItem> 

如果您正在尋找更高的目標語言的答案找到問題的評論從@AsadSaeeduddin

相關問題