用作类型参数约束的空接口或空基类

时间:2016-05-18 13:07:39

标签: c# .net generics type-parameter type-constraints

假设我在C#中有一个泛型类,其声明如下:

public abstract class DtoQuery<T> where T : class
{ }

现在,type参数始终是“Dto”类。我有很多这些,但“问题”是它们没有没有的共同点。它们都只有一堆(不同的)公共属性,没有方法。

理想情况下,我想让DtoQuery<T>类只接受这样的“Dto”类作为其类型参数。所以我要么需要创建一个空接口IDto或一个空abstract class Dto

问题:我应该选择哪一个?注意:Dto类永远不会扩展任何其他内容或彼此!

(P.S。好奇:我保证我不会构建极其愚蠢的东西,这是测试项目中的实用功能,不会用于生产代码)。

2 个答案:

答案 0 :(得分:3)

假设您(无论出于何种原因),看起来像这样的层次结构:

public class Person { }
public class Employee : Person { }
public class Boss : Person { }

现在想象一下,我们不希望将Person视为DTO - 我们只希望员工和老板成为DTO。

在这种情况下,使用抽象类来表示DTO是不可能的,因为你只能从C#中的一个父类继承。

这是为什么使用界面更好的客观原因。主观上,接口也更好,因为抽象类的目的是提供一些功能。除此之外,对接口没有任何好处。

经验法则是:当您不确定时,请始终使用界面。只有在需要实现时才使用抽象类。

答案 1 :(得分:2)

我同意@ Rob的回答,但是既然你提到“Dto类永远不会扩展任何其他东西或彼此”我将添加另一个可能会让你走向界面的原因:

如果选择界面,可以将其保留在内部。公共类可以实现内部接口,但不能扩展内部类。这也意味着您的库的使用者将无法使用相同的抽象基类创建新的DTO类型。

您还提到过这将在测试项目中使用,因此您可以使用[assembly: InternalsVisibleToAttribute("Name.Of.Test.Project")]属性将其公开给您的测试程序集。