设计通用接口,需要类型或方法的类型参数?

时间:2009-01-16 18:44:58

标签: .net generics

我有一个非常瘦的界面,它将定义一个方法。我应该在类定义上需要type参数吗?

public interface ISomethingFun<T>
{
    void Do(T item);
}

或方法定义?

public interface ISomethingFun
{
    void Do<T>(T item);
}

什么理由?是否更容易实现,继承或动态生成?是风格吗?是否有适用的OO指南?

4 个答案:

答案 0 :(得分:1)

在方法上使用泛型的优点是它有助于类型推断。

void Example(ISomethingFun fun) {
  fun.Do(42);
}

你去,一个完全通用的调用,没有通用参数。将通用参数放在类型上会强制您在元数据中显示类型时添加通用签名或绑定

void Example2<T>(ISomethingFun<T> fun) { ... }

这不一定是坏事,事实上经常是必要的。这只是一个区别。

通常,如果每个方法都有相同的泛型参数,只需将其添加到类型:)

答案 1 :(得分:1)

  • 如果班级处理T,则将其放在班级上。
    • 一个具体示例:一个整数列表 - 您正在搜索42。
List<int> g;
g.Find(42); 
  • 如果Class不处理T,那么将它放在Method上,但Method会处理。
    • A具体示例:对象列表,您正在搜索值为42的整数。
ArrayList g;
g.Find<int>(42)

答案 2 :(得分:1)

它应该在界面上。

接口的使用者应该能够约束Do期望的类型。它只能通过约束ISomethingFun的类型来实现。实施者应该知道期望什么类型。如果泛型参数在方法上,则实现者必须处理任何类型,而消费者就没有发言权。

答案 3 :(得分:0)

这只是我的直觉,但由于只有一种方法,我会把它放在方法上。

那样的Do&lt; T&gt;的呼叫者不必明确指定T.

SomethingFun fun = new SomethingFun();
fun.Do( DateTime.Now );