【问题标题】:Are tag (or "marker") interfaces obsolete?标签(或“标记”)接口是否已过时?
【发布时间】:2009-06-11 19:11:19
【问题描述】:

我正在努力帮助同事了解 OO,但我发现在某些情况下,很难找到标签(或 marker em>) 界面。 (不包含方法的接口;它仅用作标记或标记或标签)。虽然这对于我们的讨论来说真的无关紧要,但我们使用 PHP 作为讨论背后的平台(因为它是我们之间的通用语言)。我可能不是教授 OO 的最佳人选,因为我的大部分背景都是高度理论的,而且大约 15 岁,但我就是他所拥有的。

无论如何,我发现关于标签接口的讨论很少,这让我相信它甚至没有被充分利用,不足以值得讨论。我错了吗?

【问题讨论】:

  • 也许一个链接可以解释你所说的“标签界面”是什么意思?

标签: oop theory


【解决方案1】:

Java 中使用了标签接口(Serializable 就是一个明显的例子)。 C# 甚至 Java 似乎都在远离这一点,但更倾向于使用属性,它可以完成同样的事情,但也可以做得更多。

我仍然认为在没有 .NET 和 Java 所具有的属性概念的其他语言中,它们仍有一席之地。

预计到达时间:

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

一些现实世界的例子:

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

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

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

【讨论】:

  • 你能举一个真实的例子吗?
  • @Oorang - 好的,提供了一些示例。希望这能澄清一点。
  • 很好的答案和现实世界的例子。我在实际用例中使用空接口(用户可以在运行时动态扩展一些实体类),但我不知道它被称为标记/标签接口。
【解决方案2】:

在 .Net 中,标签接口非常适合与反射和扩展方法一起使用。标签接口通常是没有任何方法的接口。它们允许您查看对象是否属于某种类型,而无需反射您的对象。

.Net Framework 中的一个示例INamingContainer 是 ASP.Net 的一部分

【讨论】:

  • Sweet... 投反对票。看起来他们在询问标签接口是否有任何用处。而且我想他们被使用的一个例子是一件坏事。
  • 我发现标记接口有用的其他原因是伪造多重继承和静态继承。
  • 否决票是因为此答案中给出的建议与 MS 推荐的设计指南直接冲突。框架设计指南说:不要使用空接口;一定要使用属性。不是我不同意这个答案;是我认为它实际上是有害的。
  • 那本指南是什么时候写的。在 .Net 3.5 出来之前,我会考虑同意这种观点。如果更新通用过滤器以匹配属性,我可能会考虑改回来。但与此同时,查看对象是否属于特定类型比枚举所需对象的所有属性更容易。
  • 这个答案stackoverflow.com/questions/1023068/… 列出了一些非常好的理由来支持标记接口而不是属性
【解决方案3】:

我自称是 OO 程序员,但我从未听说过标签接口。

【讨论】:

  • 好吧,你不熟悉这个词,但你已经看过这个成语了。我经常听到它们被称为“标记接口”。一个空接口,没有方法或属性。 Java中的可序列化就是其中之一。 java.sun.com/javase/6/docs/api/java/io/Serializable.html 在 .NET 中,这个成语是不受欢迎的。
  • 是的,现在我查了一下,我知道它是什么了。我在 Java 中使用了 Serializable,但并不知道它被称为标签接口。我觉得这确实有点诡计。我想不出任何时候我想在我的代码中做这样的事情。
【解决方案4】:

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

【讨论】:

  • 我同意,尤其是最后一句话。频繁使用标签接口可能表明对象模型设计不佳。
  • @Eric... 我不同意你的观点。标签接口非常有用。不使用属性获取编译时元数据的另一种方法。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    .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 推荐的任何其他曝光点,例如这本书。

    【讨论】:

    • 属性对于附加扩展方法是没有用的
    • 对 - 属性不是接口,如果这就是你的意思的话。
    • 这就是标记接口有用的原因。 (不要当傀儡8o)
    • 我不明白你的评论或你为什么称我为木偶。您是说标记接口很有用,因为这种用法违反了推荐的做法?因为它让开发人员感到惊讶?因为这是一种创造性的方式来做一些属性做得更好的事情?
    • 另外这本书是 .Net 3.5 之前的(除此之外,我的例子是框架的接口。所以他们不会对他们太反感)
    【解决方案7】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-28
      • 2016-11-27
      • 2012-10-28
      • 2023-03-23
      • 2011-01-05
      • 1970-01-01
      • 2017-02-17
      相关资源
      最近更新 更多