2015-11-10 31 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())