你认为泛型类型定义从非泛型类型派生出来很重要吗?

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 属性),我一般会定义一个非泛型的基础类型,并将不依赖于类型的操作放在那里,像这样:

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

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

鉴于此,我可以使用抽象基类型轻松获取任何构建在通用类型定义上的实例的计数。

那么,问题非常简单,您认为提供此功能(也可以通过接口完成)是否重要?

1个回答

0
在我看来,这是你调用的方法的问题。
如果该方法要求使用IEnumerable,它向调用者声明它不需要比接口提供的更多内容。 如果该方法需要知道Count,它应该直接要求正确的接口,例如,变成泛型并声明一个类型为ICollection的参数。
也就是说,当已经存在可以完成工作的标准接口时,就没有必要创建“新”的集合类型。

抱歉不同意。如果您查看Enumerable.Count()的实现,您可能会明白为什么。简而言之,我的代码将接受一个IEnumerable,但如果传递的对象是一个集合,我的代码可以基于能够提前获取序列中项目数量的能力来优化它所做的事情。- Tony Tanzillo 2分钟前 - Tony Tanzillo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接