2012-02-20 63 views
3

这是一个常见的问题的一个简单的例子:您认为从非泛型类型派生泛型类型定义很重要吗?

ICollection<int> myIntegers = .... 
    ICollection<string> myStrings = .... 

在某些时候,我通过这些和其他 类型的实例来接收这些类型为IEnumerable方法。 (非通用形式)。

没有通过反射从后门黑客, 代码无法确定:

1. That the instance is a constructed type of ICollection<T> 

    2. The number of elements in the ICollection<T>-based type. 

不知道一般的说法是什么。

当我定义一个通用的类型,其提供操作 具有所述通用参数类型 无依赖性(例如,像的ICollection的Count属性),I 我大体限定一个非通用的基本类型,这是 在这里我把非类型相关的操作,比如:

public abstract class FrugalList 
{ 
    public abstract int Count {get;} 
} 

public class FrugalList<T> : FrugalList 
{ 
    public override int Count {get{...}} 
    void Add(T item) {...} 
} 

鉴于这种情况,我可以用抽象基类 获得建造在泛型类型定义的任何类型 的实例的计数, 容易。

所以,问题是很简单,你觉得 重要的是要提供此功能 (这也可以通过接口来完成)?

回答

0

在我看来,这是您调用的方法的问题。

如果该方法要求IEnumerable,它向调用者声明它不需要比该接口提供的更多。 如果方法需要知道计数,它应该只是要求正确的接口,例如,变得通用,并用ICollection<T>类型的参数声明。

也就是说,当存在执行该作业的现有标准接口时,不需要创建“新”收集类型。

+0

抱歉不同意。如果你看一下Enumerable.Count()的实现,你可能会明白为什么。简而言之,我的代码将接受IEnumerable,但如果传入的对象是一个集合,那么我的代码可以根据能够事先获取序列中的项目数来优化它的功能。 - Tony Tanzillo 2分钟前 – 2012-02-21 02:52:22