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

Empty interface or empty base class to use as type parameter constraint

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

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

现在,类型参数旨在始终是 "Dto" class。我有一堆,但是 "problem" 是它们 nothing 的共同点。它们都只有一堆(不同的)public 属性,没有方法。

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

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

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

假设您有(无论出于何种原因)如下所示的层次结构:

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

现在想象一下,我们不希望 Person 被视为 DTO - 我们只希望 Employee 和 Boss 成为 DTO。

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

这就是为什么使用界面更好的 objective 原因。主观上,接口也更好,因为抽象 class 的目的是提供一些功能。除此之外,与接口相比没有任何优势。

经验法则是:不确定时始终使用界面。如果您 需要 实现,请仅使用抽象 class。

我同意@Rob 的回答,但既然你提到了 "the Dto classes will never extend anything else or each other" 我将添加另一个可能会提示你使用界面的原因:

如果选择接口,则可以将其保留在内部。 public class 可以实现内部接口,但不能扩展内部 class。这也意味着您的库的使用者将无法使用相同的抽象基 class.

创建新的 DTO 类型

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