7

我需要一个用于我的通用接口的 DTO 类的基类。

但是 DTO 类没有任何共同点。它们只是包含一些属性的愚蠢类。

public void GetGridData()
{

   IDataForGrid<DTOBase> aa;

   if(request == 1) aa = new CustomerGridData;
   if(request == 2) aa = new OrderGridData;

   var coll = aa.GetList();
}

public class CustomerGridData : IDataForGrid<CustomerDTO>
{
  ...
}
4

4 回答 4

7

这不是一个糟糕的设计,虽然有点不常见。这样想 - 至少有两个好处,而没有缺点:

  • 基类用作接口的过滤器,因此您不能将任何对象传递给它们 - 只是您的 DTO 对象。标记接口也可以做到这一点。
  • 当他们最终确实有一些共同点时,很容易将其添加到那里,而您不必重构所有内容。
于 2010-03-11T10:57:08.893 回答
6

如果它们没有任何共同点,您将如何处理从列表中检索到的实例?

在任何情况下,拥有基类意味着当(好吧,如果)您确定他们以后确实需要共同拥有的东西时,您不必返回并重构(重新构建)所有内容。但是在任何情况下,我都会考虑使用接口而不是基类来处理这类事情,因为听起来并不强烈需要重用底层实现(因为它们还没有任何共同点!)。这取决于你认为他们以后可能最终有什么共同点。

于 2010-03-11T10:54:09.430 回答
3

.NET 编码指南说,拥有一个空的基类或接口(也称为“标签”接口)确实是不好的风格。首选样式是使用属性来注释同类的类。还有一个FxCop 规则来强制执行此约定。

然而,我有时(在极少数情况下)使用这个习语,当一个公共基类用于表示一个公共层次结构时,即使不存在公共功能。属性不能用于此。

例如,在一种编程语言的解释器中,几个方法返回一个特殊的基类Value,即在该编程语言中具有值的东西。基本上,这个值可以是数字到字符串(它们是特殊类,不是System.Int32or System.String)再到复合对象的所有内容。我可以返回System.Object,但这会使我的公共界面的输入变弱。

良好的、自我记录的代码受益于受限制的界面。

于 2010-03-11T10:58:00.327 回答
1

在 java 中,这称为标记接口。该链接提供了一些关于标签接口、它们的用途和问题的良好背景。

于 2010-03-11T11:00:02.600 回答