オブジェクトがクラスにあるように、インターフェースへの契約はありますか?
コードから実行コードまで、このような同一のものを区別する必要は何ですか? クラスにクラスと名前を付け、インスタンス化された実行クラスにオブジェクトと名前を付ける背後にあるアイデアはある程度理解できますが、全体として、これらの半冗長な用語の唯一の理由はそれだけですか?
あまり。ここには 4 つの用語があるので、それぞれについて説明します。
インターフェイスは抽象クラスです (Java のような多重継承がない言語では、個別のデータ型などの他の制限がある場合があります)。これは、同様に動作する多くのオブジェクトにアクセスするための共通のベースとして使用することを目的としています。 . 概念的には、抽象化の要件はありませんが、通常、インターフェイスには少なくとも 1 つの抽象メソッドがあります。インターフェースは、プログラムが多数の同様のクラスと通信するための方法であり、それぞれが異なるセマンティクスを持ちますが、一般的な目的は同じです。
コントラクトは、ユーザーとクラスまたはインターフェイスの実装者の間で行う暗黙の合意です。たとえば、事前条件と事後条件 (通常、不変条件はクラスの実装内のコントラクトです。通常、内部メンバー間の関係などは公開する必要はありません)。戻り値または引数の仕様もコントラクトの一部にすることができます。これは基本的に関数/クラス/インターフェースの使用方法を表しており、通常、どの言語でも完全に表現できるわけではありません (Eiffel などの一部の言語では、明示的なコントラクトを入れることができますが、これらの言語でさえ、常に要件を完全に具体化できるとは限りません)。 )。インターフェイスを実装するか、クラスから派生する場合、常にインターフェイスの要件を満たす必要があります。または、非抽象クラスをオーバーライドする場合は、
クラスは明らかに以前に使用したことがあるので、多くのことを繰り返す必要はありません。クラスはデータ型であり、一部の言語ではインターフェイスのスーパーセット (C++ のように正式な定義がない) であり、他の言語 (Java など) では独立しています。
オブジェクトは、クラス型 (または通常はクラス以外の型) のインスタンスです。オブジェクトの正確な定義は言語に非常に固有ですが、一般的な定義は、同じものへの複数の参照/ポインターによって参照される実際のものです。たとえば、Java などの一部の言語では、== は 2 つの変数がそれらが意味的に同じであるかどうかは必ずしも同じではありません。オブジェクトはクラスやインターフェースから独立しており、単一のインスタンスを表します。別の考え方としては、クラスまたはインターフェイスが型であり、オブジェクトが型から出てくる物理オブジェクトです (かなり悪い例えですが、今思いつく限りではこれが最善です)。
いいえ、そうではありません。クラスは、ユーザーが定義するテンプレートです。そのクラスをインスタンス化する各オブジェクトは、テンプレートに従います。2 つのことは同一ではないため、これらは実際には冗長な用語ではありません。クラスは、ユーザー定義のデータ型と考えることができます。int
プリミティブ データ型がリテラル値 3 と異なるのとまったく同じように、クラスとオブジェクトは互いに異なります。
インターフェイスは、すべての実装クラスがサポートする必要があるメソッドのセットを定義します。インターフェイス自体は、実装するクラスに対して定義するコントラクトです。インターフェイスを実装するすべてのクラスには、そのインターフェイスのパブリック メソッドのセットが必要であるというだけです。
そうですね...インターフェイスがコントラクトを指定する場合、クラスが特定のオブジェクトの(または複数の)インスタンスを指定するよりも。
ただし、用語はアプリケーションほど重要ではありません。
前の回答を完了するために、インターフェイスについて一言:
クラスがオブジェクトのテンプレート以上のものである場合 (そのグローバルな特性がインスタンスから独立しているため)、インターフェイスも視点として記述できます。
いくつかのインターフェースを実装するクラス:
「視点」とは、そのインターフェースによって定義されたコントラクトだけに集中することで、オブジェクトを使用できることを意味します。
「抽象化」(クラスの特性のいくつかを引き継ぐが、他のいくつかを除外するもの)のように、インターフェースが「抽象クラス」であるという側面においてです。Java の世界では、インターフェイスは実際には多くのことを残しています。これは、静的メソッドや関数ではなく、たとえばコントラクトを定義するためにのみ適用できるためです。
実際には、オブジェクトがクラスのインスタンスである場合、インターフェイスはコントラクトです。それらは、共通点があまりない異なるものです。
インターフェイスは、オブジェクトのファサードを提供するか、オブジェクトが実装されていることを知らなくても、オブジェクトが何らかの操作を実行できることを呼び出し元に保証します。
たとえば、同じインターフェイス/コントラクトを実装する 2 つのクラスを持つことができますが、まったく異なることを行います (それらを行う意味は同じかもしれません)。
たとえば、IDisposable インターフェイスを見てみましょう。各オブジェクトは、使用するリソースを解放できますが、さまざまな方法で解放でき、何も解放しないことを選択できます。それはオブジェクトの選択です。
少なくともこれは .NET の POV になります。
「クラス」と「オブジェクト」は 2 つの異なるものを表します。それらは関連していますが、それらが表すものはかなり異なります。
これを説明する最良の方法は、静的を見ることです。クラスは、そのクラスのインスタンスから完全に分離された静的メンバーを持つことができます。そのクラスのオブジェクトは、これらの静的メンバーを使用する場合と使用しない場合があります。ただし、そのクラスのオブジェクトのインスタンスは、そのクラスの静的使用とは完全に分離されています (または、少なくともそうあるべきです)。
または、シングルトン パターンを考えてみてください。クラス オブジェクトのインスタンスを静的クラス アクセサーに格納することは一般的な方法であり、その違いを示しています。クラスの静的アクセサーを参照して、シングルトン クラスのオブジェクト インスタンスを取得します。クラスの静的メンバーに参照するオブジェクト インスタンスがない場合、クラスはオブジェクトのインスタンスを作成します。
別の言い方をすれば; オブジェクトはクラスのインスタンスです。しかし、クラスは、オブジェクトがインスタンス化される単なるテンプレートではありません。クラスの静的メンバーは、それらのクラスのオブジェクト インスタンスから完全に独立したメモリ内の表現を持ちます。