题
在 C# 中,我们有接口。这些是从哪里来的?它们在 C++ 中不存在。
解决方案
接口相当古老,并且已经存在了很长一段时间。
早期(1970 年代中后期)非面向对象语言(例如 Modula 和 Euclid)使用称为“模块”的构造来指定组件之间的接口。然后,组件将通过显式导入和导出模块相互通信。C# 中的接口是同一概念的面向对象的演变。
C# 中的接口直接扩展自 C++(和 Java)中的接口概念,它们被用作 COM 的一部分来描述面向对象的组件接口。
编辑: 在进行少量研究时,我能找到的最早带有明确“接口”关键字的语言是 Modula-3,它是 1986 年左右创建的 Modula 的衍生版本。
其他提示
接口也是 COM 的核心部分,COM 是将接口与实现分离的非常成功的技术。
它们来自java,引入它们是因为java(和C#)不允许多重继承。
编辑: 我收到了一些 downmod,因为在 C++ 中使用 COM 接口的人不同意上述声明。不管怎样,接口的概念来自于java,C++ COM接口是虚拟类,java是第一个将其作为语言特性的语言。
结束编辑
例如,在 C++ 中,您可以有一个继承自 Animal 和 Mammal 的名为 Dog 的类。
在 C# 中,您将有一个名为 Animal 的基类,并使用一个接口 (IMammal)。I 命名符号是 C++ 历史上的(它用于表示抽象虚拟类),并被延续到 java,但在 C# 中更重要,因为没有简单的方法来区分什么是基类,什么是基类。来自 C# 类声明的接口:
public class Dog : Animal, IMammal
而在 Java 中则更明显:
public class Dog extends Animal implements IMammal
多重继承非常棘手,因此派生了接口来简化它。一个C#类只能继承一个基类,但可以实现N个接口。
在C++中,可以使用纯虚拟类来模拟接口。这些要求继承类以多态方式重写所有方法。
我的印象是第一个 形式化的 接口的概念来自 Objective-C(称为“协议”)。我可以肯定地告诉你,Java 至少继承了 Objective-C 的思想,所以并不是 Java 首先有接口。
如果您进行 COM 编程,则 C++ 中就存在接口,这就是 IPrefix 约定的起源。
尽管 C++ 本身并不原生支持接口,但 COM/C++ 使用从接口定义语言生成的类型库,该语言的唯一目的是定义接口,并使用 界面 早在 Java 或 C# 之前就有了关键字。
除了允许某种形式的多重继承之外,.NET 接口的动机与其面向组件的起源有关,其主要目的是定义组件之间的契约,这些组件可以在不了解彼此的实现的情况下进行互操作。一些 COM 互操作也是通过 .NET 接口完成的。
C++ 允许多重继承。当 Java 开发时,决定了单继承,但允许类实现多个接口。C#继承了这个概念。
它们存在于 C++ 中,但被称为虚拟基类,仅由纯虚函数组成。这就是接口的“I-”前缀的由来——用于区分虚拟基类和抽象基类。
我首先在java中看到了关键字interface,但它们比那要古老得多。
C++ 中也存在同样的概念,但并不完全相同。它们被称为“纯虚拟课堂”
http://en.wikipedia.org/wiki/Virtual_function
它们以不同的语法存在,但允许 OOP 中的多态性。
据我所知,计算领域最早的接口实现来自 CORBA。
我的理解是,这个概念来自电气和电子工程,例如,任何了解规范的人都可以使用(和实施)墙上的电源插座。然后,接口以编程方式提供相同的灵活性。
顺便说一句,虽然它们不是为了减少版本控制问题而创建的,但它们肯定可以帮助解决这些问题。
我认为接口来自这样一个事实:一些程序员厌倦了一遍又一遍地编写方法的实现。你可以写多少次:
static string Method(int i)
没有想到一定有更简单的方法吗?
在 C++ 中,您可以拥有一个没有实现的抽象类,并且可以继承多个类。Java和C#摆脱了多重继承,因此为了能够继承多个契约(而不是行为),他们创建了接口。C# 中只能继承一个类,但可以继承任意多个接口。
接口只是一个契约。它说明实例必须实现哪些成员。然而,它这样做并没有实现任何默认行为。
好吧,没有任何语言集成机制语法,但您可以使用纯虚拟类在 C++ 中实现接口。
class IFoo
{
public:
void Bar() =0;
void Bar2() =0;
};
class Concrete : public IFoo
{
public:
void Bar() { ... }
void Bar2() { ... }
}
接口来自计算机科学。或者,可以说,来自编程常识。接口是类的方法的逻辑组。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
}
虽然不称为“接口”,但以函数指针作为结构元素的 C 数据结构指针早在 C++ 使用虚拟基类(IMO)之前就实现了接口的概念。
CORBA 中也使用了接口。接口定义语言(IDL)用于独立于对象实现的任何语言来描述接口。这不仅分离了接口和实现,还分离了接口和语言绑定。
这只是另一个抽象层。不太确定它是从哪里来的..我仍然经常听到它们被称为契约而不是接口。
我认为基本思想是“多重继承”。所以这个想法来自C++。