質問

オブジェクトはクラスであるため、インターフェイスとのコントラクトはありますか?

このような同一のものを、コードから実行コードまで区別する必要性は何ですか?クラスをクラス、インスタンス化された実行クラスをオブジェクトと命名することの背後にあるアイデアを得ましたが、全体的に、これらの半冗長用語の唯一の理由ですか?

役に立ちましたか?

解決

そうでもない。ここには4つの用語があるので、それぞれについて説明します。

インターフェース

インターフェイスは、複数の継承にアクセスするための共通のベースとして使用されることを目的とした抽象クラスです(Javaのような多重継承のない言語、場合によっては別のデータ型などの制限があります)。 -動作するオブジェクト。概念的には、抽象性の要件はありませんが、通常、インターフェースには少なくとも1つの抽象メソッドがあります。インターフェースは、プログラムが多くの類似したクラスと通信するためのメソッドであり、それぞれが異なるセマンティクスを持ちますが、汎用性は同じです。

契約

契約とは、クラスまたはインターフェースのユーザーと実装者との間で行う暗黙の合意です。たとえば、事前条件と事後条件(通常、不変式はクラスの実装内のコントラクトです。一般に、内部メンバー間の関係などを公開する必要はありません)。戻り値または引数の指定は、契約の一部にすることもできます。基本的には関数/クラス/インターフェイスの使用方法を表し、一般的にどの言語でも完全に表現可能ではありません(エッフェルのような一部の言語では、明示的なコントラクトを入れることができますが、これらでも常に要件を完全に満たすことはできません)。インターフェースを実装するか、クラスから派生する場合、常にインターフェース要件を満たす必要があります。または、非抽象クラスをオーバーライドする場合、外部ビューアーが違いに気付かないほど十分に似た動作をする必要があります(これはLiskov置換の原則;派生オブジェクトは、外部の観点からの動作に違いがないベースを置換できる必要があります。

クラス

クラスは以前に使用したことがあるので、多くのことを調べる必要はありません。クラスはデータ型であり、一部の言語ではインターフェイスのスーパーセット(C ++のように正式な定義がない)であり、他の言語では独立しています(Javaなど)。

オブジェクト

オブジェクトは、クラス型(または通常、非クラス型)のインスタンスです。オブジェクトの正確な定義は言語に非常に固有ですが、一般的な定義は、同じものへの複数の参照/ポインターによって参照される実際のものです-たとえば、Javaのような一部の言語では、==は2つの変数が必ずしも意味的に同じであるかどうかにかかわらず、同じオブジェクト。オブジェクトはクラスやインターフェースから独立しています-それらは単一のインスタンスを表します。もう1つの考え方は、クラスまたはインターフェイスが型であり、オブジェクトが型から出てくる物理オブジェクトであるということです(かなり悪い例えですが、今すぐに思い付くことができます)。

他のヒント

いいえ、そうでもありません。クラスは、定義するテンプレートです。そのクラスをインスタンス化する各オブジェクトは、テンプレートに従います。この2つのことは同一ではないため、実際には冗長な用語ではありません。クラスは、ユーザー定義のデータ型と考えることができます。クラスとオブジェクトは、プリミティブデータ型 int がリテラル値3と異なるのとまったく同じ方法で互いに異なります。

インターフェイスは、すべての実装クラスがサポートする必要がある一連のメソッドを定義します。インターフェイス自体は、実装クラスに対して定義するコントラクトです。インターフェイスを実装するクラスには、そのインターフェイスのパブリックメソッドのセットが必要であるとだけ書かれています。

まあ...インターフェイスがコントラクトを指定する場合、クラスが特定のオブジェクトの(または複数の)インスタンスを指定するよりも。

ただし、用語はアプリケーションほど重要ではありません。

実際には、オブジェクトがクラスのインスタンスである場合、インターフェイスはコントラクトです-それらは共通点があまりない異なるものです。

このインターフェースは、オブジェクトの外観、または呼び出し側に、オブジェクトの実装を知らなくてもオブジェクトが何らかの操作を実行できるという保証を提供するだけです。

たとえば、同じインターフェース/コントラクトを実装する2つのクラスを持つことができますが、まったく異なることを行います(実行する意味は同じかもしれませんが)。

たとえば、IDisposableインターフェイスを使用します。各オブジェクトは、使用するリソースを解放できますが、さまざまな方法で実行できます。何も解放しないことを選択できます。それはオブジェクトの選択です。

少なくともこれは.NETのPOVです

前の回答を完了するために、インターフェースについて一言:

クラスがオブジェクトのテンプレート以上のものである場合(インスタンスに依存しないグローバルな特性のため)、インターフェイスは 視点 としても説明できますstrong>

いくつかのインターフェースを実装するクラス:

  • 尊重する必要がある契約を完了します
  • 実装されたインターフェースによって表されるものの視点から、そのクラスのインスタンスをユーザーが表示できるようにします。

"視点"そのインターフェースで定義されたコントラクトのみに焦点を当てることでオブジェクトを使用できることを意味します。

この側面では、インターフェースは「抽象クラス」であり、「抽象」クラスと同様です。 (クラスの特性のいくつかを引き継ぐものの、他のいくつかを除外するもの)。 Javaの世界では、インターフェイスは実際には多くのことを省きます。これは、静的メソッドや関数ではなく、たとえばコントラクトを定義するためにのみ適用できるためです。

"クラス"および" Object" 2つの異なることを表します。それらは関連していますが、それらが表すものは非常に強く異なります。

これを説明する最良の方法は、静的を調べることです。クラスには、そのクラスのINSTANCEとは完全に分離された静的メンバーを含めることができます。そのクラスのオブジェクトは、これらの静的メンバーを使用する場合と使用しない場合があります。ただし、そのクラスのオブジェクトのインスタンスは、そのクラスの静的な使用とは完全に分離されています(少なくとも分離されるべきです)。

またはシングルトンパターンを考えます。静的なクラスアクセサーにクラスオブジェクトのインスタンスを格納することは一般的な方法であり、違いを示しています。シングルトンクラスのオブジェクトインスタンスを取得するには、クラススタティックアクセサーを参照します。 クラスの静的メンバーに参照するオブジェクトのインスタンスがない場合、クラスインスタンスオブジェクト

別の方法で入力します。オブジェクトは クラスのインスタンスです。クラスは、オブジェクトがインスタンス化される単なるテンプレートよりも多くになる可能性があります。クラスの静的メンバーには、それらのクラスのオブジェクトインスタンスから完全に独立したメモリ内の表現があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top