C# にはインターフェイスがあります。これらはどこから来たのですか?それらは c++ には存在しませんでした。
18 に答える
インターフェイスはかなり古く、かなり前から存在しています。
Modula や Euclid などの初期 (1970 年代半ばから後半) の非オブジェクト指向言語は、コンポーネント間のインターフェイスを指定するために「モジュール」と呼ばれる構造を使用していました。コンポーネントは、明示的なインポートおよびエクスポート モジュールを介して相互に通信します。C# のインターフェイスは、同じ概念をオブジェクト指向に進化させたものです。
C# のインターフェイスは、オブジェクト指向のコンポーネント インターフェイスを記述するために COM の一部として使用されていた C++ (および Java) のインターフェイスの概念から直接拡張されています。
編集:少量の調査を行う中で、明示的な「インターフェイス」キーワードで見つけることができた最も初期の言語は、1986 年頃に作成された Modula の派生物である Modula-3 でした。
インターフェイスは COM の中心的な部分でもありました。これは、インターフェイスを実装から分離するための非常に成功したテクノロジでした。
インターフェイスの最初の形式化された概念は、Objective-C (「プロトコル」と呼ばれる) から来たという印象を受けました。Java は少なくとも Objective-C から着想を得たので、最初にインターフェースを持ったのは Java ではありませんでした。
これらは 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
多重継承は非常に扱いにくいため、単純化するためにインターフェイスが派生しました。AC# クラスは 1 つの基本クラスからしか継承できませんが、N 個のインターフェイスを実装できます。
C++ では、純粋仮想クラスを使用してインターフェイスをシミュレートできます。これらは、すべてのメソッドが継承クラスによってポリモーフィックにオーバーライドされることを必要とします。
COM プログラミングを行った場合、インターフェイスは C++ に存在します。これは、IPrefix 規則の起源です。
C++ 自体はインターフェイスをネイティブにサポートしていませんでしたが、COM/C++ は、インターフェイスを定義することのみを目的としたインターフェイス定義言語から生成されたタイプ ライブラリを使用し、Java や C# が行うずっと前にインターフェイスキーワードを使用していました。
多重継承の形式を許可することは別として、インターフェイスに対する .NET の動機は、そのコンポーネント指向の起源に関係しており、その主な目的は、互いの実装を知らなくても相互運用できるコンポーネント間のコントラクトを定義することです。一部の COM 相互運用は、.NET インターフェイスでも行われます。
私が知っているコンピューティングでのインターフェースの最も初期の実装は、CORBA によるものです。
私の理解では、この概念は、仕様を知っている人なら誰でも、たとえば壁の電源コンセントを使用 (および実装) できる電気および電子工学から生まれました。インターフェイスは、プログラムによって同じ柔軟性を提供します。
ちなみに、これらはバージョン管理の問題を軽減するために作成されたものではありませんが、確かにそれらを助けることができます.
一部のプログラマーは、メソッドの実装を何度も何度も書くことにうんざりしていたという事実から、インターフェイスが生まれました。あなたは何回書くことができますか:
static string Method(int i)
もっと簡単な方法があるはずだと考えずに?
C++ では多重継承が可能です。Java が開発されたとき、単一の継承が決定されましたが、クラスは複数のインターフェイスを実装できました。C# はこの概念を継承しています。
これらは C++ に存在していましたが、純粋仮想関数のみで構成される仮想基本クラスとして知られていました。仮想基本クラスと抽象基本クラスを区別するために、インターフェイスの "I-" 接頭辞はここから来ています。
java で最初にキーワード インターフェイスを見たことがありますが、それらはそれよりもずっと古いものです。
同じ概念が c++ にも存在しますが、まったく同じではありません。それらは「純粋仮想クラス」と呼ばれます
http://en.wikipedia.org/wiki/Virtual_function
それらは異なる構文で存在しますが、OOP でポリモーフィズムを可能にするために存在します。
「インターフェイス」とは呼ばれていませんが、構造体の要素として関数ポインタを使用するCデータ構造ポインタは、c ++が仮想基本クラスIMOを使用するずっと前に、インターフェイスの概念を実装していました。
インターフェイスは CORBA でも使用されました。インターフェイス定義言語 (IDL) は、オブジェクトが実装されている言語に関係なく、インターフェイスを記述するために使用されました。これにより、インターフェイスと実装だけでなく、インターフェイスと言語バインディングも分離されました。
言語に統合されたメカニズムの構文はありませんでしたが、純粋な仮想クラスを使用して C++ でインターフェイスを実現できます。
class IFoo
{
public:
void Bar() =0;
void Bar2() =0;
};
class Concrete : public IFoo
{
public:
void Bar() { ... }
void Bar2() { ... }
}
C++ では、実装のない抽象クラスを持つことができ、複数のクラスを継承できます。Java と C# は複数の継承を排除したため、複数のコントラクト (動作ではなく) を継承できるようにするために、インターフェイスを作成しました。C# では 1 つのクラスしか継承できませんが、インターフェイスはいくつでも継承できます。
インターフェースは単なるコントラクトです。インスタンスが実装する必要があるメンバーを示します。ただし、デフォルトの動作を実装せずにこれを行います。
インターフェイスはコンピュータ サイエンスから生まれました。または、プログラミングの常識から言ってみましょう。インターフェイスは、クラスのメソッドの論理グループです。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++から生まれました。