假设我在C#中有一个泛型类,其声明如下:
public abstract class DtoQuery<T> where T : class
{ }
现在,type参数始终是“Dto”类。我有很多这些,但“问题”是它们没有没有的共同点。它们都只有一堆(不同的)公共属性,没有方法。
理想情况下,我想让DtoQuery<T>
类只接受这样的“Dto”类作为其类型参数。所以我要么需要创建一个空接口IDto
或一个空abstract class Dto
。
问题:我应该选择哪一个?注意:Dto类永远不会扩展任何其他内容或彼此!
(P.S。好奇:我保证我不会构建极其愚蠢的东西,这是测试项目中的实用功能,不会用于生产代码)。
答案 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")]
属性将其公开给您的测试程序集。