Interfaces的概念来自哪里?

时间:2008-09-19 02:06:21

标签: language-agnostic interface

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

18 个答案:

答案 0 :(得分:10)

界面非常陈旧,已经存在了很长一段时间。

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

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

编辑:在进行少量研究时,我能找到的最明确的“界面”关键词是Modula-3,它是1986年左右创建的Modula的衍生物。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

他们来自java,因为java(和C#)不允许多重继承而引入它们。

编辑:我收到了一些downmods,因为在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 ++中,可以使用纯虚拟类来模拟接口。这些要求所有方法都由继承类覆盖多态。

答案 3 :(得分:3)

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

Email from Patrick Naughton

答案 4 :(得分:2)

如果你进行了COM编程,那么接口就存在于C ++中,这是IPrefix约定所源自的地方。

尽管C ++本身并不支持接口,但COM / C ++使用了从接口定义语言生成的类型库,其唯一目的是定义接口,并在Java或C#之前使用接口关键字那样。

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

答案 5 :(得分:1)

它们存在于C ++中,但它们被称为虚拟基类,它只包含纯虚函数。这是接口的“I-”前缀来自 - 用于区分虚拟基类和抽象基类。

答案 6 :(得分:1)

我在java中首先看到了关键字接口,但它们比它更老了。

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

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

我在计算中最早了解的接口来自CORBA。

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

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

答案 9 :(得分:1)

我的接口来自于一些程序员厌倦了一遍又一遍地编写方法的实现。你能写多少次:

static string Method(int i)

不假思索必须有更简单的方法吗?

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

在C ++中,您可以拥有一个没有实现的抽象类,并且可以继承多个类。 Java和C#摆脱了多重继承,因此为了能够继承多个契约(而不是行为),他们创建了接口。您只能在C#中继承一个类,但您可以根据需要继承任意数量的接口。

接口是合约。它说明实例必须实现的成员。但是,它会在不实现任何默认行为的情况下执行此操作。

答案 12 :(得分:0)

接口来自计算机科学。或者,从编程中的常识来看。 接口是一个类的方法的逻辑组。 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
}

答案 13 :(得分:0)

虽然没有被称为'interfaces',但是在使用虚拟基类IMO之前很久,C语言结构指针作为结构元素的C数据结构指针实现了接口的概念。

答案 14 :(得分:0)

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

答案 15 :(得分:-3)

答案 16 :(得分:-4)

这只是另一层抽象。不确定它来自哪里......我仍然经常听到它们叫合同而不是接口。

答案 17 :(得分:-5)

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