C# 列表中的协方差
我们如何正确地设计以下模型?我有两个班级的图书馆。图书馆2参考了图书馆1。但是库1没有库2的参考 库1:C# 列表中的协方差,c#,.net,C#,.net,我们如何正确地设计以下模型?我有两个班级的图书馆。图书馆2参考了图书馆1。但是库1没有库2的参考 库1: public class BaseData { /*Some Properties*/ } public class BaseGroup { /*Some data*/ public List<BaseData> DataList; } public class ChildData : BaseData { /*Some more data*/ }
public class BaseData
{
/*Some Properties*/
}
public class BaseGroup
{
/*Some data*/
public List<BaseData> DataList;
}
public class ChildData : BaseData
{
/*Some more data*/
}
public class ChildGroup
{
/*Some more data*/
public List<ChildData> DataList;
}
公共类基本数据
{
/*一些性质*/
}
公共类基组
{
/*一些数据*/
公共列表数据列表;
}
库2:
public class BaseData
{
/*Some Properties*/
}
public class BaseGroup
{
/*Some data*/
public List<BaseData> DataList;
}
public class ChildData : BaseData
{
/*Some more data*/
}
public class ChildGroup
{
/*Some more data*/
public List<ChildData> DataList;
}
公共类ChildData:BaseData
{
/*更多数据*/
}
公营儿童组
{
/*更多数据*/
公共列表数据列表;
}
我如何设计这些模型,使我有一个列表。该列表可以在库1中启动,然后在库2中更新。同样从库2中,我需要将ChildGroup
对象传递给库1方法,该方法将BaseGroup
作为参数。您不能使列表
协变-它是不变的,您对此无能为力。您不能将列表
视为列表
,因为您不能调用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
}
公共类基本数据{}
公共类基组,其中T:BaseData
{
公共列表数据列表;
}
公共类ChildData:BaseData{}
公共类ChildGroup:BaseGroup
{
//这里不需要单独的列表
}
标题与问题无关。你能不能只添加一个从库1到库2的引用?@MarcusMüller:确实如此,尽管做得不太好。@MarcusMüller:这不是C#中使用的术语@马库斯穆勒:在数学的多个分支中都有这样一种观点,即两个事物可以以某种相关的方式变化。这里的用法来自范畴理论,而不是统计学。