2015-09-08 2 views
3

Я пытаюсь создать типы конкретных классов, но я не могу вернуть их обратно в качестве своего общего представления, может кто-нибудь, пожалуйста, скажите мне, как этого достичь? Я немного озадачен контр/ковариационной магиейПроблемы с конфликтами/ковариации с генериками

public DashboardNotification<IDashboardEntry> Get() 
{ 
    //return new MyNotWorkingNotification(); // doesn't compile, I want to achieve this 
    return new MyWorkingNotification(); // compiles 
} 

public class DashboardNotification<T> where T : IDashboardEntry 
{ 
} 

public interface IDashboardEntry 
{ 
} 

public class MyNotWorkingNotification : DashboardNotification<MyDashboardEntry> 
{ 
} 

public class MyWorkingNotification : DashboardNotification<IDashboardEntry> 
{ 
} 

public class MyDashboardEntry : IDashboardEntry 
{ 
} 

ответ

6

Давайте переименуем ваши типы.

interface IAnimal {} 
class Cage<T> where T : IAnimal {} 
class Tiger : IAnimal {} 

Ваш вопрос: У меня есть Cage<Tiger>, и я хочу использовать его в качестве Cage<IAnimal> потому тигр животное.

Теперь вы видите, почему это незаконно? В клетке тигров могут храниться только тигры; клетка животных может содержать любое животное. Если клетку тигров можно использовать в качестве клетки животных, то вы можете положить рыбу в клетку тигра, которая не сделает ни тигра, ни рыбу очень счастливой.

Что вы хотите, это общая ковариация классов, но C# поддерживает только общую ковариацию на интерфейсах и делегатах.

+0

Согласен с этим, поэтому мне нужен интерфейс как таковой * IDashboardNotification где T: IDashboardEntry *? Это единственное решение? – Ruskin

+1

@Ruskin: Это * a * решение, но далекое от решения * только *. Предпочтительным решением является: перестать пытаться захватить так много в системе общего типа. Он не предназначен для представления сложных отношений. Похоже, вы пытаетесь кодировать бизнес-логику в системе типов; не делайте этого. –

+0

В приведенном выше примере нет бизнес-логики, поэтому не уверен, как вы это делаете? Кроме того, разве это не то, что было введено ковариацией ... представлять «сложные» отношения? – Ruskin

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