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

可能重复:
标记界面的目的是什么?

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

public interface ISomething { } 

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

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

接口用于描述行为合同。 空接口不会描述任何行为 – 您在此处未定义任何forms的合同。

接口设计指南具体说:

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

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

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

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

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

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

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

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

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

我个人并不准备制定一个永远不会使用标记界面的强硬规则,但如果它们不仅仅用于“标记”,我就可以看到潜在的垮台 – 在这种情况下属性可能更合适。

也就是说,如果我第一次遇到一个空接口(我记得肯定是Java大约2000年),我第一次遇到一个属性(C#web services) – 我能够推断出一个但另一个迫使我进入学习模式……

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

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