10

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

4

18 回答 18

10

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

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

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

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

于 2008-09-19T03:14:43.087 回答
5

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

于 2008-09-19T02:18:47.463 回答
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

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

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

于 2008-09-19T02:08:16.507 回答
3

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

帕特里克·诺顿的电子邮件

于 2008-09-19T02:51:31.520 回答
2

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

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

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

于 2008-09-19T02:39:54.323 回答
1

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

于 2008-09-19T02:09:04.100 回答
1

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

于 2008-09-19T02:10:47.077 回答
1

我首先在java中看到了关键字interface,但它们比这要老得多。

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

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

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

于 2008-09-19T02:12:04.157 回答
1

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

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

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

于 2008-09-19T02:46:00.207 回答
1

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

static string Method(int i)

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

于 2009-01-26T05:15:54.087 回答
0

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

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

class Concrete : public IFoo
{
public:
  void Bar() { ... }
  void Bar2() { ... }
}
于 2008-09-19T02:10:34.143 回答
0

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

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

于 2008-09-19T02:13:47.460 回答
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
}
于 2008-09-19T07:02:55.703 回答
0

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

于 2008-10-30T01:27:24.127 回答
0

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

于 2009-01-26T05:40:08.797 回答
-3

爪哇,也许?

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

于 2008-09-19T02:08:04.120 回答
-4

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

于 2008-09-19T02:08:59.420 回答
-5

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

于 2008-09-19T02:09:10.387 回答