回答:
次の答えはGofの本(デザインパターン)からです
オブジェクトのクラスは、オブジェクトの実装方法を定義します。クラスは、オブジェクトの内部状態とその操作の実装を定義します。
対照的に、オブジェクトの タイプは、そのインターフェース(応答できる要求のセット)のみを参照します。
オブジェクトは多くのタイプを持つことができ、異なるクラスのオブジェクトは同じタイプを持つことができます。
//example in c++
template<typename T>
const T & max(T const & a,T const &b)
{
return a>b?a:b; //> operator of the type is used for comparison
}
max関数には、オペレーションのある型が必要です>独自の型を持つ1つの型として、上記の要件を満たす任意のクラスをインターフェイスとして使用して、そのクラスの特定のmax関数を生成できます。
私は常に「タイプ」を「クラス」と「プリミティブ」の包括的な用語と考えています。
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
ウィキペディアに触発され...
中型理論の観点から、
タイプは、抽象インターフェースです。
タイプは一般に、人、場所、物、または名詞化されたものなどの名詞を表します。
クラスは型の実装を表します。
具体的なデータ構造とサブルーチンの集まりです
異なる具象クラスは、(型システムに応じて)同じ抽象型のオブジェクトを生成できます。
*たとえば、2つのクラスで型 Stack
を実装する場合があります:(SmallStack
小さいスタックの場合は高速ですが、スケーリングが不十分です)およびScalableStack
(小さいスタックの場合は十分にスケーリングしますが、オーバーヘッドが大きくなります)。*
同様に、特定のクラスにはいくつかの異なるコンストラクターがある場合があります。
バナナの例。
Banana
タイプは、一般に、バナナの特性および機能を表すことになります。
ABCBanana
そしてXYZBanana
クラスはバナナを製造する方法を表します。
(実際のさまざまなバナナサプライヤー、またはビデオゲームでバナナを表現および描画するためのさまざまなデータ構造と機能)。次に、クラスは、クラスのインスタンスで
ABCBanana
ある特定のバナナを生成でき ます。それらは、タイプ Bananaのオブジェクトになります。ABCBanana
プログラマが型に対して単一かつ唯一の実装を提供することはまれではありません。この場合、クラス名はタイプ名と同じであることがよくあります。ただし、タイプ(必要に応じてインターフェースで抽出できる)と、クラスのインスタンス(オブジェクト)を構築する実装(個別のインターフェースを実装する)がまだあります。
タイプには、データの説明(プロパティ、操作など)が含まれます。
クラスは特定のタイプであり、オブジェクトのインスタンスを作成するためのテンプレートです。
厳密に言えば、クラスは特別な概念であり、オブジェクトのいくつかの側面を説明するメタデータのサブセットを含むパッケージと見なすことができます。
たとえばC#では、インターフェイスとクラスを見つけることができます。どちらも型ですが、インターフェイスは一部のコントラクトしか定義できず、クラスとは異なりインスタンス化できません。
簡単に言えば、クラスは、オブジェクトのプロパティと動作をカプセル化するために使用される特殊なタイプです。
ウィキペディアはあなたにもっと完全な答えを与えることができます:
それを最も速く説明するには:
構造体はタイプですが、構造体はクラスではありません。
ご覧のとおり、Typeはクラスの定義だけでなく、構造体やfloat、int、boolなどのプリミティブデータ型も表す「抽象」用語です。
Type
は、System.Type
タイプの説明を保持するために使用されるシステムクラス()の短縮名(図のように大文字で表記)であることです。
タイプは概念的にはクラスのスーパーセットです。広義では、クラスはタイプの1つの形式です。
クラスに密接に関連しているのはインターフェースであり、これは非常に特殊なクラス、つまり純粋に抽象的なクラスと見なすことができます。これらもタイプです。
したがって、「タイプ」には、クラス、インターフェース、およびほとんどの言語のプリミティブも含まれます。また、ドットネットCLRのようなプラットフォームにも構造タイプがあります。
区別の別の例を追加するには、C ++には、クラスを参照できるポインター型と参照型がありますが、それ自体はクラスではありません。
Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"
関係するクラスは1つだけですが、ほぼ無限の数のタイプを使用できます。一部の言語では、関数は「ファーストクラスオブジェクト」と見なされます。その場合、関数の型はクラスです。他の場合では、関数の型は単なるポインタです。クラスには通常、データとそのデータに対する操作を保持できるという概念があります。
私の考えは、akuの答えとほぼ一致しています。
私はクラスをオブジェクトを構築するためのテンプレートと見なしていますが、タイプはそれらのオブジェクトを分類する方法であり、オブジェクトへのインターフェースを提供します。
Pythonは、クラスがオブジェクトを構築するのと同じ方法で、クラスを構築するための単なるメカニズムであるメタクラスも追加します(そして、クラスとメタクラスは両方ともオブジェクトです)。
ランバでの同じ質問に対するこの回答は、私にとっては究極の説明のようです。
下からGoFの引用から引用:
オブジェクトのクラスは、オブジェクトの実装方法を定義します。クラスは、オブジェクトの内部状態とその操作の実装を定義します。
対照的に、オブジェクトの タイプは、そのインターフェース(応答できる要求のセット)のみを参照します。
Javaを使用した例を提供したいと思います。
public interface IType {
}
public class A implements IType {
public A{};
}
public class B implements IType {
public B{};
}
どちらのクラスもインターフェイスA
をB
実装しているため、型になりIType
ます。さらにJavaでは、両方のクラスが独自の型を生成します(それぞれのクラス名に対して)。したがって、クラスA
はタイプA
で IType
あり、クラスB
はタイプでB
あり、 IType
満足のいくものです:
オブジェクトは多くのタイプを持つことができ、異なるクラスのオブジェクトは同じタイプを持つことができます。
サブタイプとサブクラスの違いは、おそらくその問題の理解にも役立ちます。
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
タイプは、特定の値を使用して実行できる一連の処理であると考えています。たとえば、整数値がある場合、それを他の整数に追加(または他の算術演算を実行)したり、整数引数を受け入れる関数に渡したりできます。オブジェクト値がある場合は、そのクラスで定義されているメソッドを呼び出すことができます。
クラスはそのクラスのオブジェクトで実行できることを定義するため、クラスは型を定義します。ただし、クラスはそれだけではありません。メソッドがどのように実装されているか(タイプによって暗黙指定されていないもの)とオブジェクトのフィールドがどのようにレイアウトされているかも説明しているためです。
また、オブジェクトの値は1つのクラスしか持つことができませんが、すべてのスーパークラスがオブジェクトのクラスで使用可能な機能のサブセットを提供するため、複数のタイプを含む場合があることに注意してください。
したがって、オブジェクトとタイプは密接に関連していますが、実際には同じものではありません。
Int FloatやcharなどのCの型は、それらを操作できる特定のメソッドで操作できるデータを定義します。それほど複雑ではありません。intと同様に、加算、減算、乗算、および除算が可能です。これらは、intのメソッド(または操作)です。クラスは、単に新しいタイプの定義です。まず、データの外観を定義します。多分それは単一のビットです。多分それは実数部と虚数部を持つ複合体のような2つの言葉かもしれません。あるいは、木星の奇妙な粒子の原子的な構成を表す309734325バイトのこの複雑なものかもしれません。私は気にしません。整数のように、この新しいデータ型で実行できる操作を構成します。整数の場合、加算、減算などを行いました。この新しいデータ型を使用して、意味のある操作を定義できます。足し算などかもしれません。しかし、彼らは他のものを追加するかもしれません。これらは、クラスに追加することにしたメソッドです。
肝心な点は、Cの型では、データが何であるかを定義しているということです。バイト、ワード、浮動小数点数、文字など。ただし、これらのいずれも、正当な操作を意味し、信頼できる結果を生成します。
クラスは、インターフェースと受け入れ可能な操作を定義するのはユーザー次第です。クラスはこれらのものを定義し、オブジェクトでインスタンス化すると、型定義が操作時の整数の動作を定義するのと同じように、オブジェクトの動作を定義します。
クラスは、新しい型とその動作方法に関するすべてを定義する柔軟性を提供するだけです。
これを定義すると、「thingy」クラスのオブジェクトをインスタンス化するたびに、定義したデータ構造と、それを使用して実行できると述べた操作(メソッド)が含まれます。"thingy"クラスは、C ++で定義できる新しい型に他なりません。
タイプは、通常、プリミティブ値の分類(整数、文字列、配列、ブール値、nullなど)を指します。通常、新しいタイプを作成することはできません。
クラスとは、オブジェクトの作成時にオブジェクトが関連付けられる、プロパティとメソッドの名前付きセットを指します。通常、必要な数の新しいクラスを定義できますが、言語によっては、新しいオブジェクトを作成して、それにメソッドをアタッチする必要があります。
この定義の大部分は真実ですが、一部の言語は型とクラスをさまざまな方法で組み合わせようとしており、さまざまな有益な結果をもたらしています。
興味深い質問です。akuの答えはその場にあると思います。ArrayList
例としてJava クラスを取り上げます
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
クラスのインスタンスは、それが拡張するすべてのスーパークラスと、それが実装するすべてのインターフェースの型であると言われています。したがって、インスタンスのArrayList
クラス型を有しArrayList
、RandomAccess
、Cloneable
、など。つまり、値(またはインスタンス)は1つ以上のタイプに属し、クラスはこれらのタイプを定義します。
異なるクラスが同じ型を表す場合があります。
タイプは次の部分で構成されます。
クラスは次の部分で構成されています。
いくつかのメモ:
インターフェース(Javaのように)はタイプではありません。セマンティクスを記述しないためです(構文のみを記述)
サブクラスはサブタイプではありません。サブクラスはスーパークラスで定義されたセマンティクスを変更する可能性があるため、サブタイプはスーパータイプのセマンティクスを変更できません(Liskov Substitution Principle、たとえばこのLSPの例を参照)。
この質問をC#のコンテキストで考えると、次のような答えになります。
C#の型システムは、次のカテゴリに分類されます。
値のタイプ:
参照タイプ:
ご覧のとおり、C#にはClassがそれらの1つにすぎない多くの型があります。重要な注意点が1つだけあります。C#の型システムは、任意の型の値をオブジェクトとして処理できるように統合されています。C#のすべての型は直接的または間接的にオブジェクトクラス型から派生し、オブジェクトはすべての型の最終的な基本クラスです。参照型の値は、値を型オブジェクトとして表示するだけで、オブジェクトとして扱われます。値型の値は、ボックス化およびボックス化解除操作を実行することによってオブジェクトとして扱われます。
私が見るように、タイプはそれらのクラスがそれらの1つである多くのアイテムの傘です。
参照:CSahrp言語仕様ドキュメント、4ページ