Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何在抽象类(C#)的泛型集合中使用派生类型?_Generics_C# 4.0_Collections_Types - Fatal编程技术网

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)
    {
    }
}