タイプとクラスの違いは何ですか?
-
19-08-2019 - |
質問
タイプとクラス、およびその逆の違いは何ですか?
(一般的な言語に依存しない意味で)
解決
次の回答はGof bookからのものです(デザインパターン)
オブジェクトのクラスは、 オブジェクトが実装されています。クラス オブジェクトの内部状態を定義し、 その実装 操作。
対照的に、オブジェクトの タイプはそのインターフェースのみを参照します- リクエストのセット 応答します。
オブジェクトには多くのタイプがありますが、 異なるクラスのオブジェクトは 同じタイプです。
//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関数には、 operation <!> gt; のタイプが必要です。そのインターフェースの1つとして、上記の要件を満たすクラスを使用して、そのクラスの特定のmax関数を生成できます。
他のヒント
私は常に「タイプ」を「クラス」と「プリミティブ」の包括的な用語と考えています。
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
ウィキペディアに触発された...
型理論の用語では、
-
タイプは抽象的なインターフェースです。
タイプは一般に、人、場所、物、名義化された何かなどの名詞を表します。 -
クラスは、型の実装を表します。
具体的なデータ構造とサブルーチンのコレクションです異なる具象クラスは、同じ抽象型のオブジェクトを生成できます(型システムによって異なります)。
*たとえば、 type
Stack
を2つのクラスで実装できます:SmallStack
(小さなスタックに対しては高速ですが、スケーリングは不十分です) (スケールは良好ですが、小さなスタックではオーバーヘッドが高くなります)。*同様に、与えられたクラスにはいくつかの異なるコンストラクタがあります。
バナナの例。
A
ScalableStack
type は、一般的なバナナのプロパティと機能を表します。
Banana
およびABCBanana
クラスは、バナナの生産方法を表します。
(現実のさまざまなバナナサプライヤ、またはビデオゲームでバナナを表現および描画するためのさまざまなデータ構造と機能)。
XYZBanana
クラスは、特定のバナナを生成できます。 <=> クラスの インスタンス 、タイプの オブジェクト em>バナナ。
プログラマーが1つの型に対して唯一の実装を提供することは珍しくありません。この場合、クラスの名前は多くの場合、タイプ名と同じです。ただし、(必要に応じてインターフェイスで抽出できる)型と、クラスのインスタンス(オブジェクト)を構築する(別のインターフェイスを実装する)実装がまだあります。
Typeは、利用可能なすべてのオブジェクトテンプレートまたは概念の包括的な用語です。クラスは、そのようなオブジェクトテンプレートの1つです。構造型、整数型、インターフェース型なども同様です。これらはすべて型です
必要に応じて、次のように見ることができます。タイプは親コンセプトです。他のすべての概念:クラス、インターフェース、構造、整数などはこの概念を継承します。つまり、これらは型です
Typeには、データの説明(つまり、プロパティ、操作など)が含まれます。
クラスは特定のタイプです- objects <のインスタンスを作成するテンプレートです。
厳密に言えばクラスは特別な概念であり、メタデータのサブセットを含むパッケージとして見ることができますa>オブジェクトのいくつかの側面を説明します。
たとえばC#では、インターフェイスとクラスを見つけることができます。どちらもタイプですが、インターフェースは一部のコントラクトのみを定義でき、クラスとは異なりインスタンス化できません。
簡単に言うと、クラスは、オブジェクトのプロパティと動作をカプセル化するために使用される特別な型です。
ウィキペディアは、より完全な答えを提供できます:
最速の方法で説明するには:
構造体は型ですが、構造体はクラスではありません。
ご覧のとおり、Typeは<!> quot; abstract <!> quot;です。クラスの定義だけでなく、構造体やfloat、int、boolなどのプリミティブデータ型の用語。
Typeは概念的にはクラスのスーパーセットです。より広い意味では、クラスは型の1つの形式です。
クラスに密接に関連しているのはインターフェースであり、これは非常に特別な種類のクラスと見なすことができます-純粋に抽象的なクラスです。これらもタイプです。
だから<!> quot; type <!> quot;クラス、インターフェース、およびほとんどの言語のプリミティブも含まれます。また、ドットネットCLRのようなプラットフォームにも構造タイプがあります。
私の考えは、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では、両方のクラスが(クラス名に応じて)独自の型を生成します。したがって、クラス<=>はタイプ<=> and <=>であり、クラス<=>はタイプ<=> and <=>を満たします。
オブジェクトには多くのタイプがありますが、 異なるクラスのオブジェクトは 同じタイプです。
サブタイプとサブクラスの違いは、おそらくその問題を理解するのにも役立ちます:
https://www.cs.princeton。 edu / courses / archive / fall98 / cs441 / mainus / node12.html
区別の別の例を追加するには、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つだけですが、使用できる型の数は無限に近いことに注意してください。一部の言語では、関数は<!> quot; first-class-objects <!> quot;と見なされます。その場合、関数の型はクラスです。その他では、関数のタイプは単なるポインタです。クラスには一般に、データとそのデータに対する操作を保持できるという概念があります。
型は、特定の値で実行できることのセットであると考えています。たとえば、整数値がある場合、他の整数に追加したり(または他の算術演算を実行したり)、整数引数を受け入れる関数に渡したりできます。オブジェクトの値がある場合、そのクラスで定義されているメソッドを呼び出すことができます。
クラスは、そのクラスのオブジェクトでできることを定義するため、クラスは型を定義します。クラスはそれ以上のものです。メソッドがどのように実装されているか(タイプによって暗示されていないもの)とオブジェクトのフィールドがどのようにレイアウトされているかの説明も提供するからです。
また、オブジェクトの値は1つのクラスしか持つことができませんが、すべてのスーパークラスはオブジェクトのクラスで使用可能な機能のサブセットを提供するため、複数の型を持つことができます。
したがって、オブジェクトとタイプは密接に関連していますが、実際には同じものではありません。
型は一般に、整数、文字列、配列、ブール値、nullなどのプリミティブ値の分類を指します。通常、新しい型を作成することはできません。
クラスは、オブジェクトが作成されたときに関連付けられるプロパティとメソッドの名前付きセットを指します。通常、必要な数の新しいクラスを定義できますが、一部の言語では、新しいオブジェクトを作成してからメソッドをアタッチする必要があります。
この定義はほとんど真実ですが、一部の言語では、さまざまな方法で型とクラスを組み合わせて、さまざまな有益な結果を得ようとしています。
興味深い質問。 akuの答えはスポットオンだと思う。例としてjava ArrayList
クラスを取り上げます
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
RandomAccess
クラスのインスタンスは、それが拡張するすべてのスーパークラスおよび実装するすべてのインターフェイスの型であると言われます。したがって、Cloneable
クラスのインスタンスには、タイプ<=>、<=>、<=>などがあります。つまり、値(またはインスタンス)は1つ以上のタイプに属し、クラスはこれらのタイプを定義します。
異なるクラスは同じタイプを記述できます。
タイプは次の部分で構成されています:
- 操作=構文
- 操作の説明=セマンティクス
クラスは次の部分で構成されています:
- 操作=構文
- 実装(=さまざまな実装が同じセマンティクスを記述する)
注意事項:
-
インターフェース(Javaの場合)は、セマンティクスを記述しないため(構文のみを記述するため)型ではありません
-
サブクラスはサブタイプではありません。サブクラスはスーパークラスで定義されたセマンティクスを変更する可能性があるため、サブタイプはスーパータイプのセマンティクスを変更できません(Liskov Substitution Principle、たとえばこのLSPの例)。
明らかに、OOプログラミング言語ではない型システムを持つ言語があるため、 type は class
よりも広い概念でなければなりません Javaなどの言語でも、int
は(プリミティブ)タイプですが、クラスではありません。
したがって、すべてのクラスは型ですが、すべての型がクラスではありません。
C#コンテキストでこの質問を考えた場合、以下の回答に到達します。
C#型システムは、次のカテゴリに分類されます。
値のタイプ:
- 単純型:int、long、floatなど
- 列挙型
- 構造型
- Nullable型
参照タイプ:
- クラスの種類
- インターフェースの種類
- 配列型
- デリゲート型
ご覧のとおり、C#には多くの型がありますが、クラスはそれらの1つにすぎません。 重要な注意事項が1つだけあります。 C#<!>#8217;の型システムは、任意の型の値をオブジェクトとして扱うことができるように統一されています。 C#のすべてのタイプは、直接的または間接的にオブジェクトクラスタイプから派生し、オブジェクトはすべてのタイプの究極の基本クラスです。参照型の値は、値を型オブジェクトとして表示するだけでオブジェクトとして扱われます。値型の値は、ボックス化およびボックス化解除操作を実行することによりオブジェクトとして扱われます。
そのように、typeはクラスがそのうちの1つである多くのアイテムの傘です。
参考文献:CSahrp言語仕様ドキュメント、4ページ目
一般的な言語に依存しない意味-クラスは、タイプの実現です。
多くの場合、これがそのタイプの唯一の実現である場合、両方の用語を使用して、いくつかのコンテキストでそれを参照できます。
たとえば、C#コンテキストでは、クラスは
これは私にとって良い質問でした。 Classはコンパイル時のものであり、Typeはランタイム時のものであると言うことを敢えてします。これは、型ではなくクラスを記述するためです。その後、コンパイラはクラスから型を作成し、ランタイムは型を使用してオブジェクトのインスタンスを作成します。
Int FloatやcharなどのCの型は、それらを操作できる特定のメソッドで処理できるデータを定義します。それより複雑ではありません。 intのように、乗算、減算、除算を追加、減算できます。これらはintの私のメソッド(または操作)です。クラスは、単に新しい型の定義です。まず、データがどのように見えるかを定義します。たぶん1ビットです。たぶん、実数部と虚数部を備えた複合体のような2つの単語です。それとも、木星の奇妙な粒子の原子構造を表す309734325バイトのこの複雑なものかもしれません。気にしません。整数のように、この新しいデータ型でできる操作を構成します。整数の場合、加算、減算などがありました。この新しいデータ型を使用すると、意味のある演算を定義できます。それらは加算減算などであるかもしれませんが、他のものを追加するかもしれません。これらは、クラスに追加することにしたメソッドです。
一番下の行は、Cの型を使用すると、データが何であるかを定義できるということです。バイト、ワード、フロート、文字など。ただし、これらのいずれも、どの操作が正当であり、信頼できる結果を生成するかを暗示します。
クラスは、インターフェースと受け入れ可能な操作を定義するのはユーザー次第である点を除いて、違いはありません。クラスはこれらのことを定義し、オブジェクトでインスタンス化すると、型定義が整数を操作したときの動作を定義するように、オブジェクトの動作を定義します。
クラスは、新しいタイプとその動作方法に関するすべてを定義する柔軟性を提供します。
これが定義されると、クラス<!> quot; thingy <!> quot;のオブジェクトをインスタンス化するたびに、定義したデータ構造と、それで実行できると言った操作(メソッド)があります。クラス<!> quot; thingy <!> quot;明らかに、C ++で定義できる新しい型にすぎません。