タイプとクラスの違いは何ですか?


回答:


121

次の答えは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関数を生成できます。


56

私は常に「タイプ」を「クラス」と「プリミティブ」の包括的な用語と考えています。

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass


7
素晴らしく簡潔な説明:)
aku

3
まあ、.NETでは同じでなければなりません。プリミティブでさえクラス(より正確には構造体)です。
dalle

4
@dalle:同意しました。型とクラスの間に固有の違いはありません。Eddieの例は、非常にC ++ / Javaに依存しています。それはまったく定義ではありません。
Robert Gould、

「タイプ」とクラスの「THE」定義を取得するのは難しいと思います。多くの言語には独自のタイピングシステムがあります。私が.NETについて聞いた定義の1つは、「タイプ」には参照タイプと値タイプの両方が含まれるが、クラスは参照タイプを説明するためだけに使用されるというものでした。
Eddie Parker、

2
intはSystem.Int32の省略形ではありませんか?つまり、int foo; //タイプはint、クラスはSystem.Int32ですか?
Svish

51

ウィキペディアに触発され...

型理論の観点から、

  • タイプは、抽象インターフェースです。
    タイプは一般に、人、場所、物、または名詞化されたものなどの名詞を表します。

  • クラスは型の実装を表します。
    具体的なデータ構造とサブルーチンの集まりです

    異なる具象クラスは、(型システムに応じて)同じ抽象型のオブジェクトを生成できます。

    *たとえば、2つのクラスで Stackを実装する場合があります:(SmallStack小さいスタックの場合は高速ですが、スケーリングが不十分です)およびScalableStack(小さいスタックの場合は十分にスケーリングしますが、オーバーヘッドが大きくなります)。*

    同様に、特定のクラスにはいくつかの異なるコンストラクターがある場合があります。

ここに画像の説明を入力してください

バナナの例。

  • Banana タイプは、一般に、バナナの特性および機能を表すことになります。

  • ABCBananaそしてXYZBanana クラスはバナナを製造する方法を表します。
    (実際のさまざまなバナナサプライヤー、またはビデオゲームでバナナを表現および描画するためのさまざまなデータ構造と機能)。

    次に、クラスは、クラスのインスタンスABCBananaある特定のバナナを生成でき ます。それらはタイプ BananaのオブジェクトなりますABCBanana

プログラマが型に対して単一かつ唯一の実装を提供することはまれではありません。この場合、クラス名はタイプ名と同じであることがよくあります。ただし、タイプ(必要に応じてインターフェースで抽出できる)と、クラスのインスタンス(オブジェクト)を構築する実装(個別のインターフェースを実装する)がまだあります。


3
実世界の例が与えられない限り、学ぶことに苦労している誰かとして、これは本当に私を助けました。ありがとう。
alexc95 2015

13

タイプは、使用可能なすべてのオブジェクトテンプレートまたは概念の包括的な用語です。クラスは、そのようなオブジェクトテンプレートの1つです。構造体型、整数型、インターフェース型なども同様です。これらはすべて型です

必要に応じて、次のように見ることができます。型は親の概念です。他のすべての概念:クラス、インターフェース、構造、整数などは、この概念を継承します。つまり、タイプです。


4

タイプには、データの説明(プロパティ、操作など)が含まれます。

クラスは特定のタイプであり、オブジェクトのインスタンスを作成するためのテンプレートです

厳密に言えば、クラスは特別な概念であり、オブジェクトのいくつかの側面を説明するメタデータのサブセットを含むパッケージと見なすことができます。

たとえばC#では、インターフェイスとクラスを見つけることができます。どちらも型ですが、インターフェイスは一部のコントラクトしか定義できず、クラスとは異なりインスタンス化できません。

簡単に言えば、クラスは、オブジェクトのプロパティと動作をカプセル化するために使用される特殊なタイプです。

ウィキペディアはあなたにもっと完全な答えを与えることができます:


4

それを最も速く説明するには:

構造体はタイプですが、構造体はクラスではありません。

ご覧のとおり、Typeはクラスの定義だけでなく、構造体やfloat、int、boolなどのプリミティブデータ型も表す「抽象」用語です。


2
クラスではない型が存在するフレームワークのとして.net CLRを挙げてもよいでしょう(.netにはより多くの種類の型がありますが、Javaが別の型として引用される可能性があります)。ただし、.netの余分な小さなしわTypeは、System.Typeタイプの説明を保持するために使用されるシステムクラス()の短縮名(図のように大文字で表記)であることです。
スーパーキャット

3

タイプは概念的にはクラスのスーパーセットです。広義では、クラスはタイプの1つの形式です。

クラスに密接に関連しているのはインターフェースであり、これは非常に特殊なクラス、つまり純粋に抽象的なクラスと見なすことができます。これらもタイプです。

したがって、「タイプ」には、クラス、インターフェース、およびほとんどの言語のプリミティブも含まれます。また、ドットネットCLRのようなプラットフォームにも構造タイプがあります。


rajKumar、あなたの質問はかなり曖昧です。あなたは「タイプ」について、ある言語の特徴として、または一般的な概念として同じですか?
aku

ただし、すべてのユーザー定義型がクラスであるとは限りませんが、少なくともすべての言語ではそうではありません。
jalf

jalf、それが間違った特性であることに同意します。インターフェースもユーザー定義であり、ユーザー定義型はありません。クラスは特別なニーズに対応する特殊なタイプです(オブジェクトのインスタンスの作成)
aku

インターフェースは単に特別なタイプ、純粋に抽象的なクラスです-それはまだタイプです(より大きな意味で)。
Lawrence Dol、

Software Monkey、インターフェースは純粋に抽象的なクラスではなく、特別な概念です。「ユーザー定義」はクラスの定義プロパティではありません
aku

3

区別の別の例を追加するには、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つだけですが、ほぼ無限の数のタイプを使用できます。一部の言語では、関数は「ファーストクラスオブジェクト」と見なされます。その場合、関数の型はクラスです。他の場合では、関数の型は単なるポインタです。クラスには通常、データとそのデータに対する操作を保持できるという概念があります。


3

私の考えは、akuの答えとほぼ一致しています。

私はクラスをオブジェクトを構築するためのテンプレートと見なしていますが、タイプはそれらのオブジェクトを分類する方法であり、オブジェクトへのインターフェースを提供します。

Pythonは、クラスがオブジェクトを構築するのと同じ方法で、クラスを構築するための単なるメカニズムであるメタクラスも追加します(そして、クラスとメタクラスは両方ともオブジェクトです)。

ランバでの同じ質問に対するこの回答は、私にとっては究極の説明のようです。


3

下からGoFの引用から引用:

オブジェクトのクラスは、オブジェクトの実装方法を定義します。クラスは、オブジェクトの内部状態とその操作の実装を定義します。

対照的に、オブジェクトの タイプは、そのインターフェース(応答できる要求のセット)のみを参照します。

Javaを使用した例を提供したいと思います。

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

どちらのクラスもインターフェイスAB実装しているため、型になりITypeます。さらにJavaでは、両方のクラスが独自の型を生成します(それぞれのクラス名に対して)。したがって、クラスAはタイプA ITypeあり、クラスBはタイプでB あり、 IType満足のいくものです:

オブジェクトは多くのタイプを持つことができ、異なるクラスのオブジェクトは同じタイプを持つことができます。

サブタイプとサブクラスの違いは、おそらくその問題の理解にも役立ちます。

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html


2

タイプは、特定の値を使用して実行できる一連の処理であると考えています。たとえば、整数値がある場合、それを他の整数に追加(または他の算術演算を実行)したり、整数引数を受け入れる関数に渡したりできます。オブジェクト値がある場合は、そのクラスで定義されているメソッドを呼び出すことができます。

クラスはそのクラスのオブジェクトで実行できることを定義するため、クラスは型を定義します。ただし、クラスはそれだけではありません。メソッドがどのように実装されているか(タイプによって暗黙指定されていないもの)とオブジェクトのフィールドがどのようにレイアウトされているかも説明しているためです。

また、オブジェクトの値は1つのクラスしか持つことができませんが、すべてのスーパークラスがオブジェクトのクラスで使用可能な機能のサブセットを提供するため、複数のタイプを含む場合があることに注意してください。

したがって、オブジェクトとタイプは密接に関連していますが、実際には同じものではありません。


2

Int FloatやcharなどのCの型は、それらを操作できる特定のメソッドで操作できるデータを定義します。それほど複雑ではありません。intと同様に、加算、減算、乗算、および除算が可能です。これらは、intのメソッド(または操作)です。クラスは、単に新しいタイプの定義です。まず、データの外観を定義します。多分それは単一のビットです。多分それは実数部と虚数部を持つ複合体のような2つの言葉かもしれません。あるいは、木星の奇妙な粒子の原子的な構成を表す309734325バイトのこの複雑なものかもしれません。私は気にしません。整数のように、この新しいデータ型で実行できる操作を構成します。整数の場合、加算、減算などを行いました。この新しいデータ型を使用して、意味のある操作を定義できます。足し算などかもしれません。しかし、彼らは他のものを追加するかもしれません。これらは、クラスに追加することにしたメソッドです。

肝心な点は、Cの型では、データが何であるかを定義しているということです。バイト、ワード、浮動小数点数、文字など。ただし、これらのいずれも、正当な操作を意味し、信頼できる結果を生成します。

クラスは、インターフェースと受け入れ可能な操作を定義するのはユーザー次第です。クラスはこれらのものを定義し、オブジェクトでインスタンス化すると、型定義が操作時の整数の動作を定義するのと同じように、オブジェクトの動作を定義します。

クラスは、新しい型とその動作方法に関するすべてを定義する柔軟性を提供するだけです。

これを定義すると、「thingy」クラスのオブジェクトをインスタンス化するたびに、定義したデータ構造と、それを使用して実行できると述べた操作(メソッド)が含まれます。"thingy"クラスは、C ++で定義できる新しい型に他なりません。


1

タイプは、通常、プリミティブ値の分類(整数、文字列、配列、ブール値、nullなど)を指します。通常、新しいタイプを作成することはできません。

クラスとは、オブジェクトの作成時にオブジェクトが関連付けられる、プロパティとメソッドの名前付きセットを指します。通常、必要な数の新しいクラスを定義できますが、言語によっては、新しいオブジェクトを作成して、それにメソッドをアタッチする必要があります。

この定義の大部分は真実ですが、一部の言語は型とクラスをさまざまな方法で組み合わせようとしており、さまざまな有益な結果をもたらしています。


1
型の貧弱な言語Cでも新しい型を作成できますが、構造体、レコード、およびクラスがすべて互いにある程度似ていることを除いて、人々が通常クラスと考えるものとは異なります。
James Iry

1

タイプとクラスは関連していますが、同一ではありません。私の考えでは、クラスは実装の継承に使用され、タイプはランタイムの置換に使用されます。

以下は、置換の原理と、サブクラスとサブタイプが常に同じではない理由(Javaなど)を説明するリンクです。ウィキペディアの共変性と反変性のページには、この違いについてより多くの情報を持っています。


1

では、一般的な言語に依存しない感覚- クラス実現タイプ

多くの場合、これがそのタイプの唯一の実現である場合、両方の用語を使用して、あるコンテキストでそれを参照できます。

逆に、例えば、C#のコンテキストで- クラスだけである1より多くの 実装タイプのプリミティブ、構造体、ポインタなどのような概念


0

興味深い質問です。akuの答えはその場にあると思います。ArrayList例としてJava クラスを取り上げます

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayListクラスのインスタンスは、それが拡張するすべてのスーパークラスと、それが実装するすべてのインターフェースの型であると言われています。したがって、インスタンスのArrayListクラス型を有しArrayListRandomAccessCloneable、など。つまり、値(またはインスタンス)は1つ以上のタイプに属し、クラスはこれらのタイプを定義します。


0

異なるクラスが同じ型を表す場合があります。

タイプは次の部分で構成されます。

  1. 操作=構文
  2. 操作の説明=セマンティクス

クラスは次の部分で構成されています。

  1. 操作=構文
  2. 実装(=さまざまな実装が同じセマンティクスを記述する)

いくつかのメモ:

  • インターフェース(Javaのように)はタイプではありません。セマンティクスを記述しないためです(構文のみを記述)

  • サブクラスはサブタイプではありません。サブクラスはスーパークラスで定義されたセマンティクスを変更する可能性があるため、サブタイプはスーパータイプのセマンティクスを変更できません(Liskov Substitution Principle、たとえばこのLSPの例を参照)。


0

明らかに、オブジェクト指向プログラミング言語ではない型システムの言語があるので、クラスより広い概念でなければなりません

Javaのような言語でもint(プリミティブ)型ですが、クラスではありません。

したがって、すべてのクラスはタイプですが、すべてのタイプがクラスであるとは限りません。


0

この質問をC#のコンテキストで考えると、次のような答えになります。

C#の型システムは、次のカテゴリに分類されます。

値のタイプ:

  • 単純型:int、long、floatなど。
  • 列挙型
  • 構造タイプ
  • null許容型

参照タイプ:

  • クラスタイプ
  • インターフェイスの種類
  • 配列タイプ
  • デリゲートタイプ

ご覧のとおり、C#にはClassがそれらの1つにすぎない多くの型があります。重要な注意点が1つだけあります。C#の型システムは、任意の型の値をオブジェクトとして処理できるように統合されています。C#のすべての型は直接的または間接的にオブジェクトクラス型から派生し、オブジェクトはすべての型の最終的な基本クラスです。参照型の値は、値を型オブジェクトとして表示するだけで、オブジェクトとして扱われます。値型の値は、ボックス化およびボックス化解除操作を実行することによってオブジェクトとして扱われます。

私が見るように、タイプはそれらのクラスがそれらの1つである多くのアイテムの傘です。

参照:CSahrp言語仕様ドキュメント、4ページ


-1

これは私にとって良い質問でした。あえて言うなら、Classはコンパイル時のものであり、Typeはランタイムのものです。型ではなくクラスを書くからです。次に、コンパイラはクラスから型を作成し、ランタイムは型を使用してオブジェクトのインスタンスを作成します。


1
SOへようこそ。この答えは少なくとも他の1つに非常に似ており、SOユーザーは「もの」よりも技術的な言葉を好みます。
ニック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.