标签(或“标记”)接口是否过时?

时间:2009-06-11 19:11:20

标签: oop theory

我正在努力帮助同事与OO达成协议,我发现在某些情况下,很难找到标签概念(或标记)界面。 (不包含任何方法的接口;仅用作标记或标记或标记)。虽然我们讨论的内容确实无关紧要,但我们使用PHP作为讨论背后的平台(因为它是我们之间的共同语言)。我可能不是最好的教OO的人,因为我的大部分背景都是高度理论化的,大约15岁,但我就是他所拥有的。

在任何情况下,我发现关于标签界面的讨论缺乏让我相信它甚至没有被充分利用以保证讨论。我错了吗?

7 个答案:

答案 0 :(得分:9)

标记接口在Java中使用(Serializable就是一个明显的例子)。 C#甚至Java似乎都在偏离这一点,虽然支持属性,这可以完成同样的事情,但也可以做更多。

我仍然认为在其他语言中有一个地方没有.NET和Java所具有的属性概念。

ETA:

当您拥有一个暗示实现的接口时,通常会使用此方法,但您不希望实现该接口的类实际上必须提供该实现。

一些现实世界的例子:

Serializable是一个很好的例子 - 它意味着有一个可以序列化对象数据的实现(某处),但由于它的通用实现可用,因此不需要实际让对象实现该功能本身。

另一个例子可能是网页缓存系统。假设您有一个“Page”对象和一个“RequestHandler”对象。 RequestHandler接受页面请求,定位/创建相应的Page对象,在Page对象上调用Render()方法,并将结果发送给浏览器。

现在,假设你想为渲染页面实现缓存。但遗憾的是,有些页面是动态的,所以它们不能被缓存。实现这一点的一种方法是让可缓存的Page对象实现一个ICacheable“tag”接口(反之亦然,你可以有一个INotCacheable接口)。然后,RequestHandler将检查Page是否实现了ICacheable,如果是,则会在调用Render()之后缓存结果,并在该页面的后续请求中提供这些缓存结果。

答案 1 :(得分:7)

在.Net Tag界面中,可以很好地与反射和扩展方法一起使用。标记接口通常是没有任何方法的接口。它们允许您查看某个对象是否属于某种类型而没有反射您的对象的笔杆。

.Net Framework INamingContainer中的示例是ASP.Net

的一部分

答案 2 :(得分:1)

我称自己为OO程序员,我从未听说过标签界面。

答案 3 :(得分:1)

我认为标记接口值得讨论,因为它们是界面概念的一个有趣的角落案例。不过,它们不经常使用 值得注意!

答案 4 :(得分:0)

我在表示SQL数据库的对象模型中多次使用标记接口。在这些实例中,它是特定类型对象的根接口的子类型。检查标签接口比检查属性('obj是IInterface'而不是使用反射)更容易

答案 5 :(得分:0)

.NET样式指南说使用属性而不是标记/标记接口。

alt text http://www.freeimagehosting.net/uploads/th.4528577db5.jpg
Click for Full image
来源:http://www.informit.com/articles/article.aspx?p=423349&seqNum=6
或Cwalina建议的任何其他曝光点,如书。

答案 6 :(得分:0)

我在过去一个月里曾两次使用过标签界面。在重构以使函数更通用时,它们可以解决一些令人讨厌的问题。

也就是说,我刚刚发现的另一件事是使用标记接口作为父类来处理一堆带有方法的相关接口。可以传递对象,各种预处理器可以检查它们是否需要处理特定对象。一种将处理保存在它所属的单独对象中的方法,但是在它们所属的定义中处理对象的实现细节。