包装通用接口的目的是什么?

时间:2010-02-24 10:24:34

标签: c# generics interface

我在projekt中看到许多接口只包含了一个泛型类。

一个例子:

public interface IAssertionViewModelMapper : IMapper<Assertion, AssertionViewModel>
{}

public interface ISearchPageViewModelMapper : IMapper<IList<Tag>, SearchPageViewModel>
{}

有人可以解释他们为什么这样做吗?我的意思是我可以直接实现IMapper接口。

3 个答案:

答案 0 :(得分:3)

有时团队决定他们不想依赖可能会发生变化并被弃用的内置实现。因此,它们包装了所有内容,类,接口,类型,并在项目中使用它们。他们希望有一天,当某些框架组件的支持被删除时,他们只需调整他们的包装器而不需要重写完整的软件。

我工作的情况也是如此。绝对一切都在十年前被包装,我们只使用我们的定制包装。正如你可能猜到的那样,时间已经证明大部分时间都不需要。当某些东西被弃用时,没有时间真正得救。我们仍然需要调整一些耗费大量时间的代码,但封装器并没有任何帮助。相反,包装器是不变的障碍,因为它们当时没有完全包裹东西,所以我们不得不时不时地扩展包装。

答案 1 :(得分:3)

Microsoft Code Analysis(a.k.a. FxCop)包含禁止执行此操作的规则。但是,创建这样的新界面有一些优点:

  1. 新名称可以更好地描述界面的意图(但是,C#中的别名也可以这样做)。
  2. 当您在该界面上需要新方法时,这可以节省几分钟,因为您已经定义了它。
  3. 当大多数从IMapper<T, TViewModel>派生的接口实际定义新方法时,它可以使您的代码库更加一致。即使他们没有定义新成员,也很容易发现接口。

答案 2 :(得分:1)

这样做会创建一个新的界面类型。所以如果你声明一个引用:

IAssertionViewModelMapper avmm = null;

如果实现IMapper<Assertion, AssertionViewModel>,则无法将对象分配给该对象。它们是不同的类型,只在一个方向上具有赋值兼容性:派生可以分配给base。

因此,如果有人为了缩短他们的代码而尝试这个技巧,比如在C中使用typedef,那么他们将来可能会存在一些混淆。