Я пытаюсь создать типы конкретных классов, но я не могу вернуть их обратно в качестве своего общего представления, может кто-нибудь, пожалуйста, скажите мне, как этого достичь? Я немного озадачен контр/ковариационной магиейПроблемы с конфликтами/ковариации с генериками
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
{
}
Согласен с этим, поэтому мне нужен интерфейс как таковой * IDashboardNotification где T: IDashboardEntry *? Это единственное решение? –
Ruskin
@Ruskin: Это * a * решение, но далекое от решения * только *. Предпочтительным решением является: перестать пытаться захватить так много в системе общего типа. Он не предназначен для представления сложных отношений. Похоже, вы пытаетесь кодировать бизнес-логику в системе типов; не делайте этого. –
В приведенном выше примере нет бизнес-логики, поэтому не уверен, как вы это делаете? Кроме того, разве это не то, что было введено ковариацией ... представлять «сложные» отношения? – Ruskin