c# - 用作类型参数约束的空接口(interface)或空基类

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

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

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

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

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

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

(对于好奇的人来说:我保证我不会构建一些极其愚蠢和愚蠢的东西,这是测试项目中的实用功能,不会用于生产代码)。

最佳答案

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

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

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

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

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

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

关于c# - 用作类型参数约束的空接口(interface)或空基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37300581/

相关文章:

c# - 除了测试,依赖注入(inject)有什么比静态类/方法更好的地方?

.net - 为什么在 XAML 中设置依赖属性时会在运行时绕过 .NET 属性包装器?

java - 为什么不能在上限泛型列表中添加元素?

java - 为什么Class类需要是Generic类?

c# - .NET MySqlCommand.Transaction - 它的目的是什么?

c# - C# 中 XMLwriter 的缩进和换行命令

c# - Unity NavMesh可以用来实现A*算法吗?

.net - 使用 HttpListener 时如何确保 http 请求是本地的

.net - 屏幕同步 - 事件聚合器 VS 缓存 ViewModel 引用

java - java foreach循环中的数组引用