web-dev-qa-db-ja.com

クラスまたはオブジェクトインスタンスと呼ばれますか?

言い回し/正確な質問があります。 "オブジェクトインスタンス"と書くこともあります"クラスインスタンス"と書くこともあります。

オブジェクトは常にクラスインスタンスであるのではないですか?したがって"object instance"は正しい表現ではありませんよね?

とにかくそう言うのが一般的ですか、それとも単に私の「間違い」ですか? "object instance"は不必要(2倍)な感じですobjectは常にinstanceであり、明確化のために詳しく知りたいので条件。

7
hakre

いいえ、「オブジェクト」が常にクラスのインスタンスであるとは限りません。たとえば、Cの標準(まったくクラスを持たない)は、オブジェクトを(3.14/1)として定義します。「実行環境におけるデータストレージの領域。その内容は値を表すことができます。」

現在、「オブジェクト」を使用してクラスのインスタンスを参照することは非常に一般的です。一部の言語(Smalltalkなど)では、allオブジェクトはクラスのインスタンスです。他の言語(C++など)では、Cのような用語の使用とSmalltalkのような用語の使用があるため、「オブジェクト」が具体的に参照するために使用されているかどうかは必ずしも明確ではありません。クラスのインスタンス、または実行環境のデータストレージの一部の領域のみ。これは、クラスではなくプリミティブ型のインスタンスである場合や、(たとえば)初期化されていない動的ストレージである場合があります。したがって、実際にはどのタイプのインスタンスでもありません。

「オブジェクトインスタンス」が理にかなっている限り、私はそれが可能な1つの状況を見ることができます。 Smalltalkに戻ると、Smalltalkのすべてはクラスのインスタンスです-クラスも(メタクラスと呼ばれる)クラスのインスタンスです。このような場合、クラスのクラスではなく、クラスのインスタンスについて具体的に話しているときに、「オブジェクトインスタンス」について話すのが(ある程度)意味のある場所がわかります。

ただし、公平に言えば、その使用法は間違いなく非常にまれです(多くても)。ほとんどの場合、「オブジェクトインスタンス」はおそらく単なるずさんな表現です。

15
Jerry Coffin

しばしばインスタンスと呼ばれるオブジェクトは、クラスの特定のインスタンス化です。クラスを10回インスタンス化(インスタンスを作成)すると、10個のオブジェクトが取得されますが、クラスは1つだけです。

7
Caleb

objectという用語は、(少なくとも)3つの異なる独立した概念を参照できます。

  1. クラスのインスタンス。これは、JavaおよびC#などのオブジェクト指向の強く型付けされた静的型付け言語の場合です。これらの言語では、「クラス」が定義であり、「オブジェクト」は単一のその顕現(「インスタンス」)。

  2. 関数とデータ/状態を含むメモリ内の型なし領域。これは、動的に型付けされているがまだオブジェクト指向の言語、特にJavaScriptなどのスクリプト言語に見られるものです。この場合、「クラス」も「インスタンス」も存在せず、オブジェクト、ピリオドのみが存在します。

  3. プログラム内のアドレス可能なメモリまたはデータ。これは、OOPが存在する以前は広く受け入れられていた定義であり、 Jerry Coffin で説明されているように、C仕様の一部です。

したがって、これは本質的に2つの部分からなる質問であり、答えは次のとおりです。

  • 「オブジェクト」という用語は、オブジェクト指向言語では常に正しいものです。 「クラスインスタンス」という用語は、ときどきの同義語ですが、特定の言語によって異なります。

  • 「オブジェクトインスタンス」という用語は決して正しいものではありません。クラスではなくオブジェクトを定義する言語では、「インスタンス」という用語は無意味です。すべてのオブジェクトは定義上、何かのインスタンスだからです。

安全にしたい場合は、タイプ定義(クラス)とそのタイプのインスタンスを明確に区別する必要がない限り、「インスタンス」という用語の使用は避けてください。 インスタンスメンバークラスまたは静的メンバーを参照する場合.

5
Aaronaught

クラスは、オブジェクトのコンパイル時の仕様です。オブジェクトは、その仕様の実行時の実現です。

したがって、オブジェクトを作成すると、「クラスのインスタンス」または「クラスインスタンス」が作成されます。

2
Gary Rowe

オブジェクトインスタンスは、クラスインスタンスがクラスに対応するのと同じ方法でそのオブジェクトに対応するものになります。私はその定義に一致する主流の概念を知りません...

また、クラスインスタンスが常にオブジェクトであるのは事実ですが、オブジェクトは常にクラスインスタンスであるとは限りません。一部の言語では、リテラルとしてのオブジェクトの作成をサポートしています。たとえば、次のように定義されたJavaScriptオブジェクトを考えます。

var bob = { name : "Bob", age : 31, birthday : function() { this.age++ } } ;

またはOCamlの同等物:

let bob = object
  val name = "Bob"
  val age  = 31
  method birthday = {< age <- age + 1 >}
end
2
Victor Nicollet

オブジェクトが常にクラスのインスタンスであるということではありませんか?したがって、「オブジェクトインスタンス」は正しい表現ではありませんよね?

int i;

反例による反証。

一方、すべてのオブジェクトがクラスのインスタンスであるとは限らないため、「オブジェクトインスタンス」は適切ではなく、「クラスインスタンス」でもありません。通常は「インスタンス」または「オブジェクト」とだけ言います。

0
DeadMG