2015-11-10 2 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> 

Теперь у меня есть метод в сети переменного тока, подпись которого:

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()).

Смежные вопросы