2015-09-15 2 views
4

Как мы можем правильно спроектировать следующую модель? У меня есть две библиотеки классов. Библиотека 2 имеет ссылку на библиотеку 1. Но библиотека 1 не есть ссылка на библиотеку 2.Ковариация в списке

Библиотека 1:

public class BaseData 
{ 
    /*Some Properties*/ 
} 

public class BaseGroup 
{ 
    /*Some data*/ 
    public List<BaseData> DataList; 
} 

Библиотека 2:

public class ChildData : BaseData 
{ 
    /*Some more data*/ 
} 

public class ChildGroup 
{ 
    /*Some more data*/ 
    public List<ChildData> DataList; 
} 

Как я могу создать эти модели, чтобы у меня был один список. Список может быть инициирован в Библиотеке 1 и позже обновлен в Библиотеке 2. Также из Библиотеки 2 мне необходимо передать объект ChildGroup методам Библиотеки 1, который принимает BaseGroup в качестве аргумента.

+2

Названное не имеет ничего общего с вопросом. –

+0

Не можете ли вы добавить ссылку из библиотеки 1 в библиотеку 2? –

+1

@ MarcusMüller: Это действительно так, хотя это сделано не очень хорошо. –

ответ

13

Вы не можете сделать List<T> covariant - это инвариантно, и вы ничего не можете с этим поделать. Вы не можете обработать List<Apple> как List<Fruit>, потому что вы не можете позвонить на него, например, list.Add(new Orange()).

Мне кажется, что вы должны сделать свой baseGroup класс общим, с ограничением. После этого вы можете сделать childGroup извлечь из него:

Так что - зафиксировав до имен классов, чтобы следовать соглашениям .NET именовании:

public class BaseData {} 

public class BaseGroup<T> where T : BaseData 
{ 
    public List<T> DataList; 
} 

public class ChildData : BaseData {} 

public class ChildGroup : BaseGroup<ChildData> 
{ 
    // No need for a separate list here 
} 
Смежные вопросы