我在projekt中看到许多接口只包含了一个泛型类。
一个例子:
public interface IAssertionViewModelMapper : IMapper<Assertion, AssertionViewModel>
{}
public interface ISearchPageViewModelMapper : IMapper<IList<Tag>, SearchPageViewModel>
{}
有人可以解释他们为什么这样做吗?我的意思是我可以直接实现IMapper接口。
答案 0 :(得分:3)
有时团队决定他们不想依赖可能会发生变化并被弃用的内置实现。因此,它们包装了所有内容,类,接口,类型,并在项目中使用它们。他们希望有一天,当某些框架组件的支持被删除时,他们只需调整他们的包装器而不需要重写完整的软件。
我工作的情况也是如此。绝对一切都在十年前被包装,我们只使用我们的定制包装。正如你可能猜到的那样,时间已经证明大部分时间都不需要。当某些东西被弃用时,没有时间真正得救。我们仍然需要调整一些耗费大量时间的代码,但封装器并没有任何帮助。相反,包装器是不变的障碍,因为它们当时没有完全包裹东西,所以我们不得不时不时地扩展包装。
答案 1 :(得分:3)
Microsoft Code Analysis(a.k.a. FxCop)包含禁止执行此操作的规则。但是,创建这样的新界面有一些优点:
IMapper<T, TViewModel>
派生的接口实际定义新方法时,它可以使您的代码库更加一致。即使他们没有定义新成员,也很容易发现接口。答案 2 :(得分:1)
这样做会创建一个新的界面类型。所以如果你声明一个引用:
IAssertionViewModelMapper avmm = null;
如果实现IMapper<Assertion, AssertionViewModel>
,则无法将对象分配给该对象。它们是不同的类型,只在一个方向上具有赋值兼容性:派生可以分配给base。
因此,如果有人为了缩短他们的代码而尝试这个技巧,比如在C中使用typedef,那么他们将来可能会存在一些混淆。