【问题标题】:Why is the OO concept interface not represented by a keyword in C++?为什么OO概念接口在C++中不用关键字来表示?
【发布时间】:2009-01-26 02:51:01
【问题描述】:

Java 等语言明确使用interface 关键字来表示interfaces。使用过 Java,这个概念对我来说似乎足够有用,可以证明一个关键字来强制执行这个概念。

当然可以使用纯虚拟类并将其标记为接口。但是,这个关键字似乎非常有用,并且与纯虚拟类不同,因此很有用。也许它被包含在 C++ 0x 中?

【问题讨论】:

  • @Casualcoder,仅供参考,C++ 0x 中不会包含更好或更坏的接口。但是微软的托管 C++ 确实有它们
  • 你没有说为什么你觉得它有用:)
  • 如果你真的认为这个概念需要一个关键字,只需将 /* Interface */ 放在你所有的抽象类上。为什么每个有用的概念在语言中都应该有一个保留字?
  • @Iraimbilanja:此评论太小,无法包含接口的有用性。 :)
  • 而且 Iraimbilanja 并没有询问一般接口有什么用处,而是询问它们有什么用处,C++ 中的纯虚拟类无法做到这一点。 :)

标签: c++ oop


【解决方案1】:

因为 C++ 允许多重继承,并且因为接口是一个抽象类,它的所有成员也是抽象/虚拟的,所以 C++ 不需要它 - 一个类可以简单地“扩展”多个其他类,其中任何一个都可以是纯虚拟(抽象)。

另一方面,Java 和 C# 不允许 MI,因为这些语言的设计者认为 MI 产生的问题多于解决的问题。但是一个对象仍然需要“成为”很多东西(OOP 是一种关系),所以接口提供了一种机制,允许一个对象成为很多东西,而不需要继承多个实现——保留婴儿,但扔掉洗澡水。

【讨论】:

  • 绝对不普遍接受 MI 产生的问题多于它解决的问题。其实很多OO语言都支持MI:CLOS、Eiffel、Python、OCaml等……
  • +1 @Nemanja Trifunovic - 此外,其中一些语言已经解释了使用 MI 时可能出现的问题,并提出了正确可靠的解决方案。
  • 如果使用得当,C++ MI 不会引起比它解决的问题更多的问题,就像许多 C++ 特性一样。 C++ 被设计成语言的瑞士军队电锯。
  • 由于接口与具有所有纯抽象方法的类大致相同,因此将接口用作语法糖会很好。你需要检查一个类的所有方法,看看它们是否都是抽象的和纯的。
  • @Nemanja Trifunovic:Software Monkey 没有说 MI 制造的问题多于它解决的问题。他说,“[Java 和 C#] 的设计者认为 MI 产生的问题比它解决的问题多。”支持 SM 的回答。
【解决方案2】:

这是多余的,因为接口是通过让每个类成员都是纯虚拟 (=0) 来表示的。

【讨论】:

  • 如果所有类方法不是虚拟的,它就不是接口。
  • @casualcoder:正确。如果 所有 类方法都是虚拟的,那么它实际上就是一个接口。完全正确。
  • @S.洛特:你说的对吗?休闲编码器的评论,还是这个答案?这个答案没有描述一个界面,你和casualcoder描述的方式。
  • -1,不是任何班级成员,都是班级成员,所以答案具有误导性。
【解决方案3】:

添加“interface”关键字会增加实现的复杂性,而不会添加任何真正有用的功能;它会重复现有的功能。正如其他人所说,它只是一个纯虚拟类。 Java 和 C# 必须有“接口”才能获得 C++ 已有的部分。从哲学上讲,C++ 旨在使程序员能够编写出好的软件,而不是阻止程序员编写出糟糕的软件。根据我的经验,针对 MI 的喧嚣被夸​​大了。白痴滥用它,就像他们滥用一切一样,人们没有指责白痴是白痴,而是指责该工具。

【讨论】:

    【解决方案4】:

    因为接口严格地弱于 MI。

    【讨论】:

    • 这是一个较弱的陈述,这就是它与具有所有纯虚方法的类的区别。如果有关键字,编译器甚至可以强制执行接口范例。
    • 不强制执行范例是 C++ 编译器的理念。
    【解决方案5】:

    C++ 的早期面向对象特性长期以来一直被忽视,因为它作为一种多范式语言已经朝着更有趣的方向发展。十多年来的主要焦点一直是模板及其含义,特别是在标准库中。是的,带有interface 关键字的程序会更具可读性。如果有overridenew 修饰符用于与基类方法(a la C#)同名的方法,它们也会更容易维护。但是对于现代 C++ 用户和那些为语言设计做出贡献的人来说,这些都不是有趣的问题。 OO 特性已经足够了,但不是很好,而且几乎没有在标准库的“较新”(1992 年后)部分中使用,这在某些方面可以作为良好风格的指南。

    【讨论】:

      【解决方案6】:

      接口出现在没有多重继承的语言中,部分覆盖了这一点。 C++已经有了多重继承,所以不需要了。

      此外,并非所有语言都必须相同。 C++ 有它自己的设计和历史,也有它的长处和短处,就像 Java、C# 等等。尝试使所有语言都平等是没有用的。

      【讨论】:

        【解决方案7】:

        这是一个short article from DDJ,它涉及到类和接口之间的区别。

        【讨论】:

          【解决方案8】:

          实际上,“接口”OO 概念是对象可以执行的操作。

          因此,Ruby 或 Python 等语言也有“接口”,尽管它们不需要像在 Java 中那样声明它们。

          在Java中,接口OO概念与这个“接口”关键字相匹配,用于声明一个对象将响应某个契约(多个方法)

          C++ 也有这个概念,甚至每个没有实现任何接口的 Java 对象。

          【讨论】:

            猜你喜欢
            • 2011-06-08
            • 2014-04-03
            • 2016-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-20
            • 1970-01-01
            相关资源
            最近更新 更多