问题 Interfaces的概念来自哪里?


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


5505
2017-09-19 02:06


起源



答案:


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

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

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

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


10
2017-09-19 03:14





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


5
2017-09-19 02:18



COM不是一种语言。接口是该语言的一项功能。 - AnthonyLambert


答案:


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

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

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

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


10
2017-09-19 03:14





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


5
2017-09-19 02:18



COM不是一种语言。接口是该语言的一项功能。 - AnthonyLambert


它们来自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
2017-09-19 02:08



你能详细说明一下吗? - Cetra
Java从Objective-C得到了接口的概念: cs.gmu.edu/~sean/stuff/java-objc.html - Jason Baker
IDL在Java之前有接口方式 - Mark Cidade
Java不是第一种为接口添加显式支持的语言。它们早在1986年就以Modula-3语言作为显式语言关键词存在(有关详细信息,请参阅下面的帖子)。 - Scott Wisniewski


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

来自Patrick Naughton的电子邮件


3
2017-09-19 02:51



令人惊讶的是,其他答案是多么错误...我认为严格来说SmallTalk - > Objective C - > Java。 - AnthonyLambert


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

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

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


2
2017-09-19 02:39



是的,但它们不是语言功能。 - FlySwat
从技术上讲,接口是一种语言功能。它们是语义定义的(在这些条件下创建一个类,编译器将发出与该二进制接口相对应的代码)。这个特征是语义的,而不是语法的,这一事实并没有使它成为一个特征。 - Scott Wisniewski
此外,它们是COM和CORBA接口定义语言的语法特性,这些语言是专门为定义接口而设计的语言。在任何情况下,C ++,MSIDL或CORBA(早于Java)都不是第一批提供此类功能的语言。他们一直在“永远”。 - Scott Wisniewski


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


1
2017-09-19 02:09





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


1
2017-09-19 02:10



接口比虚拟基类更有限,并且有充分的理由。例如,您不能将多态应用于接口。 - FlySwat
我相信你可以在C#中扩展接口。尚未在Java中尝试过。我不知道这是否是您所指的多态性类型。 - moffdub