2015-11-10 29 views
3

這基本上是一個設計問題。如何處理協方差限制?

我的類結構如下:

Interface IA 
interface IB<T> where T : IA 
abstract class AC<T> : IB<T> 

class D : IA 
class E : IA 
class F : AC<D> 
class G : AC<E> 

現在,我已經在AC其簽名的方法:

void foo(IB<IA> param) 

我想是F稱呼它:

foo(new G()) 

我知道協變和逆變的限制,我知道這種語言不允許它。另外,我不能設置IB<out T>

我的問題是,在設計方面處理這種情況的正確方法是什麼?

+0

你能具體說明爲什麼你不能設置'IB '? –

+0

(我懷疑這是一個重複的問題,順便說一句 - 但很難弄清楚我將如何搜索它......) –

+0

@MatthewWatson根據協方差的侷限性,當使用T時,我不能設置在哪裏限制,或用作方法的參數。 https://msdn.microsoft.com/en-us/library/dd997386(v=vs.100).aspx – Elliko

回答

6

這聽起來像你需要做的Foo方法通用:

void Foo<T>(IB<T> param) where T : IA 

在這一點上,Foo(new G())將被隱式Foo<E>(new G())