您是否认为从非泛型类型派生泛型类型定义很重要?

时间:2012-02-20 03:00:35

标签: generics

以下是一个常见问题的简单示例:

   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属性),我 我通常定义一个非泛型基类型,即 我把非类型依赖操作放在哪里,如下所示:

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

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

鉴于此,我可以使用抽象基类型 获取任何类型的实例的Count 构造在泛型类型定义上, 容易。

所以,问题很简单,你认为 提供此功能非常重要 (也可以通过接口完成)?

1 个答案:

答案 0 :(得分:0)

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

如果该方法要求IEnumerable,它向调用者声明它不需要超过该接口提供的内容。 如果该方法需要知道Count,它应该只是要求正确的接口,例如,变为泛型,并使用ICollection<T>类型的参数声明。

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