gpt4 book ai didi

c# - 如何声明返回 "anything"的泛型集合的方法 (C#)

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:53 25 4
gpt4 key购买 nike

我正在使用派生自抽象基类的通用集合类的层次结构来存储也派生自抽象基类的实体项:

abstract class ItemBase { }

class MyItem : ItemBase
{
public MyItem()
{
}
}


abstract class CollectionBase<T> : Collection<T> where T : ItemBase, new() { }

class MyCollection : CollectionBase<MyItem> { }

此模型的目标是对从 CollectionBase 派生的任何类的成员实现严格的类型规程,并保证这些成员具有默认的公共(public)构造函数。到目前为止它有效。

现在我想创建一个工厂方法,它返回从 CollectionBase 派生的类的实例。我知道通常的方法是:

public CollectionBase<T> CreateCollection<T>();

……或者也许……

public T Create CreateCollection<T>();

但是,问题是调用例程不知道需要什么“T”。工厂方法本身必须确定要返回的特定集合类型。所以我需要一个非泛型方法签名,上面写着“返回类型将从 CollectionBase 派生”。我设想这样的事情(如果它是合法的)......

public CollectionBase<> CreateCollection();

我认为这是另一个棘手的通用方差问题,但即使在阅读了 Eric Lippert 对这个主题的广泛解释之后,我仍然不清楚我正在尝试做的事情在 C# 4.0 中是否可行,以及是否存在是 C# 3.0 中的一个简单解决方法。

提前感谢您的想法。

最佳答案

假设工厂方法正在创建单个项目。你会:

public ItemBase CreateItem();

你必须使用 ItemBase因为你无法知道更具体的事情。将该原则应用于收集方法,您将获得:

public CollectionBase<ItemBase> CreateCollection();

由于缺乏差异,您需要一个派生自 CollectionBase<ItemBase> 的适配器类并包装创建的实际集合。

在 C# 4.0 中,您只需返回实际的集合。

编辑:工厂可能看起来像这样,嵌入了适配器:

public class CollectionFactory
{
public CollectionBase<ItemBase> CreateCollection()
{
if(someCondition)
{
return CreateAdapter(new MyCollection());
}
else
{
return CreateAdapter(new MyOtherCollection());
}
}

private static CollectionAdapter<T> CreateAdapter<T>(CollectionBase<T> collection) where T : ItemBase, new()
{
return new CollectionAdapter<T>(collection);
}

private class CollectionAdapter<T> : CollectionBase<ItemBase> where T : ItemBase, new()
{
private CollectionBase<T> _collection;

internal CollectionAdapter(CollectionBase<T> collection)
{
_collection = collection;
}

// Implement CollectionBase API by passing through to _collection
}
}

关于c# - 如何声明返回 "anything"的泛型集合的方法 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1450713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com