接口的概念从何而来?

时间:2020-03-06 14:24:23  来源:igfitidea点击:

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

解决方案

Java,也许?

http://java.sun.com/docs/books/tutorial/java/concepts/interface.html

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

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

结束编辑

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

在C#中,我们将有一个名为Animal的基类,并使用一个接口(IMammal)。命名符号是C ++的历史名称(用于表示抽象的虚拟类),并已延续到Java,但在C#中更重要,因为没有简单的方法可以分辨出什么是基类,什么是A。 Cclass声明的接口:

public class Dog : Animal, IMammal

而在Java中则更为明显:

public class Dog extends Animal implements IMammal

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

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

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

C ++允许多重继承。开发Java时,就决定了单一继承,但是允许类实现多个接口。提出了这个概念。

我认为基本思想是"多重继承"。因此,这个想法来自C ++。

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

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

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

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

我已经在Java中首先看到了关键字接口,但是它们比这更老了。

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

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

它们以不同的语法存在,但是可以在OOP中实现多态。

在C ++中,我们可能有一个没有实现的抽象类,并且可以继承多个类。 Java和Cgot摆脱了多重继承,因此为了具有继承多个协定(而非行为)的能力,他们创建了接口。我们只能在C#中继承一个类,但是可以继承任意数量的接口。

接口是合同。它说明实例必须实现的成员。但是,它无需执行任何默认行为即可执行此操作。

接口还是COM的核心部分,COM是一项非常成功的技术,用于将接口与实现分开。

如果我们进行COM编程,则C ++中存在接口,这是IPrefix约定的来源。

尽管C ++本身并不原生支持接口,但COM / C ++使用了由接口定义语言生成的类型库,该类库的唯一目的是定义接口,并在Java或者Cdid之前使用interface关键字。

.NET除了允许多种形式的继承外,.NET的接口动机还必须与面向组件的起源有关,其主要目的是定义组件之间的契约,这些契约可以互操作而无需彼此了解任何实现。某些COM互操作也通过.NET接口完成。

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

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

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

我的印象是,第一个形式化的接口概念来自Objective-C(称为"协议")。我可以肯定地说,至少Java是从Objective-C那里得到的,所以不是Java首先拥有接口。

帕特里克·诺顿(Patrick Naughton)的电子邮件

接口已经很老了,已经存在了一段时间。

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

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

编辑:在进行少量研究后,我发现的带有明确的"接口"关键字的最早语言是Modula-3,它是1986年左右创建的Modula的衍生物。

接口来自计算机科学。或者说,从编程常识上讲。
接口是一类方法的逻辑组。
C ++不需要单独的语言概念"接口",因为任何类都可以用作接口-只需在其中定义一组方法,不执行,像IExecutable那样调用它并使用:

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

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

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

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

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
}

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

我之所以使用界面,是因为有些程序员厌倦了反复编写方法的实现。我们可以写多少次:

static string Method(int i)

没有想到必须有一种更简单的方法?

接口也用于CORBA。接口定义语言(IDL)用于描述接口,而与实现对象所用的语言无关。这不仅分离了接口和实现,而且还分离了接口和语言绑定。