没有任何成员的界面 - 不好的做法?

时间:2010-07-22 16:12:06

标签: c# interface

  

可能重复:
  What is the purpose of a marker interface?

创建一个完全空的界面是不好的做法,例如:

public interface ISomething
{
}

有一种情况我希望以不同于其他对象的方式对待某些对象,但我不需要任何新的行为。

6 个答案:

答案 0 :(得分:24)

我个人认为空接口并不是一件好事。

接口用于描述行为合同。空接口不描述任何行为 - 您在此处未定义任何形式的合同。

design guidelines for interfaces具体说:

  

避免使用标记接口(没有成员的接口)。

     

自定义属性提供了一种标记类型的方法。有关自定义属性的更多信息,请参阅编写自定义属性。如果可以在执行代码之前推迟检查属性,则首选自定义属性。如果您的方案需要编译时检查,则无法遵守此准则。

答案 1 :(得分:12)

您是否考虑过使用属性而不是界面?这通常是我的方法。不可否认,测试一个属性的存在比一个对象是否实现一个接口要困难一些,但总的来说感觉更合适。

答案 2 :(得分:2)

我认为属性更好,但在.Net框架中有空接口的例子(例如INamingContainer - http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx)。 我一直想知道为什么那样做 - 有人知道吗?

答案 3 :(得分:1)

我同意大家的意见。我想如果给我代码来维护并看到一个没有属性或方法的接口的类,我会非常困惑。

在我最近工作的asp.net mvc应用程序中,我有一个核心操作(跟踪代码)我想在几乎每个请求上完成(但不是说和ajax请求或管理页面)。我将操作添加到基本控制器并在ExecuteCore方法中执行。对于我不希望它运行的少数情况,我在派生控制器中设置一个标志,不要运行它。

这不像属性那样干净优雅,但实现起来要简单得多。

当然,如果要为所有派生类创建泛型操作,这将无济于事。但在这种情况下,必须有一些关于对象的共同点(比如一个公共属性),这意味着接口不会是空的。

答案 4 :(得分:1)

在我看来,实现标记接口并附加没有参数的属性仅在语法上有所不同,但前者更直接用于运行时类型信息。

我不准备制定一个强硬而快速的规则,从不使用标记接口,但我可以看到潜在的垮台,如果它们不仅仅用于“标记” - 在这种情况下属性可能更适合

那就是说,如果我第一次遇到一个空接口(我记得它肯定是Java大约2000),我第一次遇到一个属性(C#web服务) - 我能够推断一个人的目的,但另一个人强迫我进入学习模式...

答案 5 :(得分:0)

我不这样做但我没有理由反对它。我经常为泛型类型创建一个基类,所以我可以包含一组通用项。接口可能是一种更简洁的方法,但我通常会在基类中找到一些内容,因此接口解决方案不适用于此。

我想你可以把它想象成一个抽象的基类?