インターフェイスの概念はどこから来たのでしょうか?
-
01-07-2019 - |
質問
C# にはインターフェイスがあります。これらはどこから来たのでしょうか?これらは C++ には存在しませんでした。
解決
インターフェースはかなり古く、かなり前から存在しています。
Modula や Euclid などの初期 (1970 年代中頃から後半) の非オブジェクト指向言語では、「モジュール」と呼ばれる構成要素を使用してコンポーネント間のインターフェイスを指定していました。その後、コンポーネントは明示的なインポートおよびエクスポート モジュールを介して相互に通信します。C# のインターフェイスは、同じ概念をオブジェクト指向に進化させたものです。
C# のインターフェイスは、オブジェクト指向コンポーネント インターフェイスを記述するための COM の一部として使用されていた C++ (および Java) のインターフェイスの概念を直接拡張したものです。
編集: 少量の調査を行ったところ、明示的な「インターフェイス」キーワードを含む最も古い言語は、1986 年頃に作成された Modula の派生版である Modula-3 でした。
他のヒント
インターフェイスは COM の中心部分でもあり、インターフェイスを実装から分離するための非常に成功したテクノロジでした。
これらは Java から来ており、Java (および C#) では多重継承が許可されていないために導入されました。
編集: 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# クラスは 1 つの基本クラスからのみ継承できますが、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 で初めてキーワード インターフェイスを見ましたが、それよりもずっと古いものです。
同じ概念が C++ にも存在しますが、まったく同じではありません。これらは「純粋仮想クラス」と呼ばれます。
http://en.wikipedia.org/wiki/Virtual_function
これらは異なる構文で存在しますが、OOP でポリモーフィズムを可能にするために存在します。
私が知っているコンピューティングにおけるインターフェイスの最も初期の実装は CORBA からのものでした。
私の理解では、このコンセプトは電気電子工学から生まれたもので、仕様を知っている人なら誰でも、たとえば壁の電源コンセントを使用 (および実装) できるというものです。インターフェイスは、プログラム的に同様の柔軟性を提供します。
ちなみに、これらはバージョン管理の問題を軽減するために作成されたものではありませんが、確かにそれらの問題を解決するのに役立ちます。
インターフェイスは、一部のプログラマがメソッドの実装を何度も書くことに飽きてしまったという事実から生まれたと思います。何回書けますか:
static string Method(int i)
もっと簡単な方法があるはずだと思わずに?
C++ では、実装のない抽象クラスを作成したり、複数のクラスを継承したりできます。Java と C# は多重継承を取り除き、複数のコントラクト (動作ではなく) を継承できるようにするために、インターフェイスを作成しました。C# では継承できるクラスは 1 つだけですが、インターフェイスは必要なだけ継承できます。
インターフェイスはコントラクトです。インスタンスがどのメンバーを実装する必要があるかを示します。ただし、これはデフォルトの動作を実装せずに行われます。
言語に統合されたメカニズムの構文はありませんでしたが、純粋な仮想クラスを使用して 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# は静的型付けを使用するため、インターフェイスの概念をクラスから明確に分離しています。その言語では多重継承は禁止されていますが、クラスが 1 つの基本クラスと別のインターフェイスを持つこと、または一度に複数のインターフェイスを実装することは問題ありません。
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++ から生まれました。