Generics 如何在抽象类(C#)的泛型集合中使用派生类型?
我有一个泛型集合,其中包含集合中的项需要调用的方法。每个项都有对泛型集合的引用。问题是我不能使用每个项的类型作为传递给泛型集合的类型 想法是这样的(我知道它不会编译):Generics 如何在抽象类(C#)的泛型集合中使用派生类型?,generics,c#-4.0,collections,types,Generics,C# 4.0,Collections,Types,我有一个泛型集合,其中包含集合中的项需要调用的方法。每个项都有对泛型集合的引用。问题是我不能使用每个项的类型作为传递给泛型集合的类型 想法是这样的(我知道它不会编译): 公共类MyCollection { 公共无效调用(T项){…} } 公共抽象类MyItemBase { 受保护的MyCollection\u收集; 公共MyItem(MyCollection集合) { 这个._collection=collection; } 公共剂量测定法() { 这个._收集.调用(这个); } } 公共类M
公共类MyCollection
{
公共无效调用(T项){…}
}
公共抽象类MyItemBase
{
受保护的MyCollection\u收集;
公共MyItem(MyCollection集合)
{
这个._collection=collection;
}
公共剂量测定法()
{
这个._收集.调用(这个);
}
}
公共类MyItem:MyItemBase
{
}
显然,您不能声明MyCollection,但我认为通过这样编写,您可以大致了解我要做的事情。本质上,我希望抽象类对集合的引用是指MyCollection
有什么办法可以让它工作吗?首先,为什么ItemBase类包含ItemCollection?如果您的集合类应该包含项,那么它是否应该是相反的呢 但是,对于您的问题上下文,如果您按照以下方式设计类,则可以实现类型安全:
public class MyCollection<T> where T : MyItemBase<T>
{
public void Call(MyItemBase<T> item) { }
}
public abstract class MyItemBase<T> where T : MyItemBase<T>
{
protected MyCollection<T> _collection;
protected MyItemBase(MyCollection<T> collection)
{
_collection = collection;
}
public void DoSomething()
{
_collection.Call(this);
}
}
public class MyItem : MyItemBase<MyItem>
{
public MyItem(MyCollection<MyItem> Collection)
: base(Collection)
{
}
}
公共类MyCollection,其中T:MyItemBase
{
公共无效调用(MyItemBase项){}
}
公共抽象类MyItemBase,其中T:MyItemBase
{
受保护的MyCollection\u收集;
受保护的MyItemBase(MyCollection集合)
{
_收集=收集;
}
公共无效剂量测定法()
{
_收款。打电话(本);
}
}
公共类MyItem:MyItemBase
{
公共MyItem(MyCollection集合)
:基本(集合)
{
}
}
将集合传递给该项似乎很奇怪,因为您可能会将该项放在另一个列表中,然后反向引用现在无效。这就是为什么我使用泛型,以便反向引用遵循相同的约定。我使用的是MVVM模式,集合中有几个属性,这些属性一次填充,然后被所有子视图模型使用。因此,将对集合的引用传递到每个视图模型的构造函数中似乎是正确的,这样它就可以访问更大的范围。也许我应该将公共属性从集合中分离出来,并将它们作为单独的引用传递给视图模型?我不知道您的设置,也许您有理由这样设计,但以下是我的想法:将父列表传递给子列表,让子对象调用父对象上的方法,并将其自身作为参数传递,如this.\u collection.call(this)代码>在大多数情况下都有改进的余地。它通常会变成这样:而不是this.parentcollection.call(this)
它只是变成base.call()
或者只是call()
,其中一个基类(MyItemBase
)做列表中的事情。免责声明:我只有你在问题中提到的东西要处理,所以对我的建议持保留态度,这对你可能没用Zasz我很感激你的想法。我一直在思考你的评论,我认为很可能我设计过度,错过了一个更简单的方法。应该可以将这两个类和适当的子类组合起来。谢谢
public class MyCollection<T> where T : MyItemBase<T>
{
public void Call(MyItemBase<T> item) { }
}
public abstract class MyItemBase<T> where T : MyItemBase<T>
{
protected MyCollection<T> _collection;
protected MyItemBase(MyCollection<T> collection)
{
_collection = collection;
}
public void DoSomething()
{
_collection.Call(this);
}
}
public class MyItem : MyItemBase<MyItem>
{
public MyItem(MyCollection<MyItem> Collection)
: base(Collection)
{
}
}