【问题标题】:Where did the concept of Interfaces come from?接口的概念从何而来?
【发布时间】:2008-09-19 02:06:21
【问题描述】:

在 c# 中,我们有接口。这些是从哪里来的?它们在 C++ 中不存在。

【问题讨论】:

    标签: language-agnostic interface


    【解决方案1】:

    界面已经很老了,并且已经存在了很长一段时间。

    早期(1970 年代中后期)非面向对象的语言,如 Modula 和 Euclid 使用称为“模块”的构造来指定组件之间的接口。然后组件将通过显式导入和导出模块相互通信。 C# 中的接口是同一概念的面向对象的演变。

    C# 中的接口直接从 C++(和 Java)中的接口概念扩展而来,在 C++(和 Java)中,它们被用作 COM 的一部分来描述面向对象的组件接口。

    编辑:在进行少量研究时,我能找到的最早带有显式“接口”关键字的语言是 Modula-3,它是 1986 年左右创建的 Modula 的派生词。

    【讨论】:

      【解决方案2】:

      接口也是 COM 的核心部分,这是一项非常成功的将接口与实现分离的技术。

      【讨论】:

      • COM 不是一种语言。接口是该语言的一项功能。
      【解决方案3】:

      它们来自java,之所以引入它们是因为java(和C#)不允许多重继承。

      编辑:我收到了一些降级,因为在 C++ 中使用 COM 接口的人不同意上述说法。无论如何,接口的概念来自于 java,C++ COM 接口是虚拟类,java 是第一个使其成为语言特性的语言。

      结束编辑

      例如,在 C++ 中,您可以有一个名为 Dog 的类,它继承自 Animal 和 Mammal。

      在 C# 中,您将有一个名为 Animal 的基类,并使用一个接口 (IMammal)。 I 命名符号是 C++ 的历史符号(它用于表示抽象虚拟类),并被带到 java 但在 C# 中更重要,因为没有简单的方法来区分什么是基类和什么是来自 C# 类声明的接口:

      public class Dog : Animal, IMammal
      

      在 Java 中更明显:

      public class Dog extends Animal implements IMammal
      

      多重继承非常棘手,因此派生了接口来简化它。一个C#类只能继承一个基类,但可以实现N个接口。

      在 C++ 中,可以使用纯虚拟类来模拟接口。这些要求继承类以多态方式覆盖所有方法。

      【讨论】:

      • 你能详细说明一下吗?
      • Java 从 Objective-C 中得到了接口的想法:cs.gmu.edu/~sean/stuff/java-objc.html
      • IDL 在 Java 之前就有接口
      • Java 并不是第一种为接口添加显式支持的语言。它们早在 1986 年就以语言 Modula-3 的形式作为显式语言关键字存在(有关详细信息,请参阅下面的帖子)。
      【解决方案4】:

      我的印象是接口的第一个形式化概念来自Objective-C(称为“协议”)。我可以肯定地告诉你,Java 至少从 Objective-C 中得到了这个想法,所以不是 Java 首先有接口。

      Email from Patrick Naughton

      【讨论】:

      • 其他答案的错误程度令人惊讶......我认为严格来说 SmallTalk -> Objective C -> Java。
      【解决方案5】:

      如果您进行 COM 编程,C++ 中就存在接口,这就是 IPrefix 约定的起源。

      虽然 C++ 本身并不支持接口,但 COM/C++ 使用由接口定义语言生成的类型库,其唯一目的是定义接口,并且早在 Java 或 C# 之前就使用了 interface 关键字做了。

      除了允许一种形式的多重继承之外,.NET 接口的动机与其面向组件的起源有关,其主要目的是定义组件之间的契约,这些契约可以在不了解彼此实现的情况下进行互操作。一些 COM 互操作也使用 .NET 接口完成。

      【讨论】:

      • 是的,但它们不是语言功能。
      • 从技术上讲,接口是一种语言特性。它们是在语义上定义的(在这些条件下创建一个类,编译器将发出对应于该二进制接口的代码)。特性是语义而非句法的这一事实并不会使其不那么具有特性。
      • 此外,它们是 COM 和 CORBA 接口定义语言的句法特征,它们是专门为定义接口而设计的语言。在任何情况下,C++、MSIDL 或 CORBA(早于 Java)都不是第一批提供此类功能的语言。他们一直“永远”存在。
      【解决方案6】:

      C++ 允许多重继承。在开发 Java 时,决定采用单一继承,但允许类实现多个接口。 C# 继承了这个概念。

      【讨论】:

        【解决方案7】:

        它们存在于 C++ 中,但它们被称为虚拟基类,仅由纯虚函数组成。这就是接口的“I-”前缀的来源——用于区分虚拟基类和抽象基类。

        【讨论】:

        • 接口比虚拟基类更受限制,这是有充分理由的。例如,您不能将多态性应用于接口。
        • 我相信你可以在 C# 中扩展接口。还没有在Java中尝试过。我不知道这是否是您所指的多态类型。
        【解决方案8】:

        我在java中第一次看到关键字interface,但它们比那更古老。

        相同的概念存在于 c++ 中,但并不完全相同。它们被称为“纯虚拟类”

        http://en.wikipedia.org/wiki/Virtual_function

        它们以不同的语法存在,但允许 OOP 中的多态性。

        【讨论】:

          【解决方案9】:

          我所知道的计算中最早的接口实现来自 CORBA。

          我的理解是,这个概念来自电气和电子工程,例如,任何了解规范的人都可以使用(和实施)墙上的电源插座。然后,接口以编程方式提供相同的灵活性。

          顺便说一句,虽然它们不是为了减少版本控制问题而创建的,但它们当然可以帮助解决这些问题。

          【讨论】:

            【解决方案10】:

            我认为接口来自这样一个事实,即一些程序员厌倦了一遍又一遍地编写方法的实现。你能写多少次:

            static string Method(int i)
            

            没想到一定有更简单的方法?

            【讨论】:

              【解决方案11】:

              在 C++ 中,您可以有一个没有实现的抽象类,并且您可以继承多个类。 Java 和 C# 摆脱了多重继承,所以为了具备继承多个契约(而不是行为)的能力,他们创建了接口。 C# 中只能继承一个类,但可以继承任意多个接口。

              一个接口就是一个契约。它说明实例必须实现哪些成员。但是,它会这样做,但没有实现任何默认行为。

              【讨论】:

                【解决方案12】:

                好吧,它没有任何语言集成机制语法,但是您可以使用纯虚拟类在 C++ 中实现接口。

                class IFoo
                {
                public:
                  void Bar() =0;
                  void Bar2() =0;
                };
                
                class Concrete : public IFoo
                {
                public:
                  void Bar() { ... }
                  void Bar2() { ... }
                }
                

                【讨论】:

                  【解决方案13】:

                  接口来自计算机科学。或者,比方说,从编程常识。 接口是类的一组逻辑方法。 C++ 不需要“接口”的单独的语言概念,因为任何类都可以用作接口——只需在其中定义一组方法,不做任何实现,将其称为 IExecutable 和使用:

                  class IExecutable
                  {
                  public:
                      virtual void Execute() = 0;
                  };
                  
                  class MyClass : public IExecutable
                  {
                  public:
                      void Execute() { return; };
                  };
                  

                  某些称为“动态类型”的语言,例如 Python,根本不需要定义接口,您只需调用所需的方法,然后运行时检查是否可能(“如果它像鸭子一样走路说话像鸭子,一定是鸭子”)。

                  C# 明确地将接口的概念与类分开,因为它使用静态类型......并且该语言中禁止多重继承,但是一个类可以有一个基类和另一个接口,或者实现多个一次接口。

                  public interface IPurring
                  {
                      void Purr();
                  }
                  
                  public class Cat : Animal, IPurring
                  {
                      public Cat(bool _isAlive)
                      {
                          isAlive = _isAlive;
                      }
                  
                      #region IPurring Members
                  
                      public void Purr()
                      {
                          //implement purring
                      }
                  
                      #endregion
                  }
                  

                  【讨论】:

                    【解决方案14】:

                    虽然不称为“接口”,但以函数指针作为结构元素的 C 数据结构指针早在 C++ 使用虚拟基类 IMO 之前就实现了接口的概念。

                    【讨论】:

                      【解决方案15】:

                      在 CORBA 中也使用了接口。接口定义语言 (IDL) 用于独立于实现对象的任何语言来描述接口。这不仅分离了接口和实现,还分离了接口和语言绑定。

                      【讨论】:

                        【解决方案16】:
                        【解决方案17】:

                        这只是另一个抽象层。不太清楚它是从哪里来的。我仍然经常听到它们被称为合同而不是接口。

                        【讨论】:

                        • 他们不抽象任何东西。它们是一个班级必须遵守的严格规则。
                        • 他们抽象出实际发生的事情。该接口仅在语义接口上设置严格的规则集,不保证实现者中发生的事情。
                        【解决方案18】:

                        我认为基本思想是“多重继承”。所以这个想法来自C++。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2016-08-30
                          • 2020-07-21
                          • 2014-07-15
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-10-18
                          • 1970-01-01
                          相关资源
                          最近更新 更多