Was ist der Unterschied zwischen Typ und Klasse?

153

Was unterscheidet einen Typ von der Klasse und umgekehrt?

(Im allgemeinen sprachunabhängigen Sinne)

yesraaj
quelle
3
Effektives C ++, Punkt 19: Behandeln Sie das Klassendesign als Typdesign.
Brent81

Antworten:

121

Die folgende Antwort stammt aus dem Gof-Buch ( Design Patterns ).

Die Klasse eines Objekts definiert, wie das Objekt implementiert wird. Die Klasse definiert den internen Status des Objekts und die Implementierung seiner Operationen.

Im Gegensatz dazu bezieht sich der Typ eines Objekts nur auf seine Schnittstelle - eine Reihe von Anforderungen, auf die es antworten kann.

Ein Objekt kann viele Typen haben, und Objekte verschiedener Klassen können denselben Typ haben.

//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
}

Für die Funktion max ist ein Typ mit Operation> mit einem eigenen Typ als Schnittstelle erforderlich. Jede Klasse, die die oben genannte Anforderung erfüllt, kann verwendet werden, um eine bestimmte max-Funktion für diese Klasse zu generieren.

yesraaj
quelle
56

Ich denke immer an einen "Typ" als Überbegriff für "Klassen" und "Primitive".

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

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

Eddie Parker
quelle
7
nette und prägnante Erklärung :)
aku
3
Nun, in .NET sollte es dasselbe sein, auch Primitive sind Klassen (oder genauer Strukturen).
Dalle
4
@dalle: Einverstanden, es gibt keinen inhärenten Unterschied zwischen Typ und Klasse. Eddies Beispiel ist sehr C ++ / Java-abhängig. Es ist überhaupt nicht die Definition.
Robert Gould
Ich kann mir vorstellen, dass es schwierig sein wird, "DIE" Definition eines "Typs" gegenüber einer Klasse zu erhalten. So viele Sprachen haben ein eigenes Schreibsystem. Eine Definition, die ich für .NET gehört habe, war, dass ein 'Typ' sowohl Ref- als auch Werttypen enthält, während eine Klasse nur zur Beschreibung von Ref-Typen verwendet wird.
Eddie Parker
2
Ist int nicht nur eine Abkürzung für System.Int32? Mit anderen Worten: int foo; // Typ ist int, Klasse ist System.Int32?
Svish
51

Inspiriert von Wikipedia ...

In typentheoretischen Begriffen;

  • Ein Typ ist eine abstrakte Schnittstelle.
    Typen repräsentieren im Allgemeinen Substantive wie eine Person, einen Ort oder eine Sache oder etwas Nominalisiertes.

  • Eine Klasse repräsentiert eine Implementierung des Typs.
    Es ist eine konkrete Datenstruktur und Sammlung von Unterprogrammen

    Verschiedene konkrete Klassen können Objekte desselben abstrakten Typs erzeugen (abhängig vom Typsystem).

    * Zum Beispiel könnte man den Typ Stack mit zwei Klassen implementieren : SmallStack(schnell für kleine Stapel, aber schlecht skalierbar) und ScalableStack(gut skaliert, aber hoher Overhead für kleine Stapel). *

    In ähnlicher Weise kann eine gegebene Klasse mehrere verschiedene Konstruktoren haben .

Geben Sie hier die Bildbeschreibung ein

Das Bananenbeispiel.

  • Ein Banana Typ würde die Eigenschaften und die Funktionalität von Bananen im Allgemeinen darstellen.

  • Die KlassenABCBanana und würden Wege zur Herstellung von Bananen darstellen. (Verschiedene Bananenlieferanten im wirklichen Leben oder verschiedene Datenstrukturen und Funktionen zum Darstellen und Zeichnen von Bananen in einem Videospiel).XYZBanana

    Die ABCBananaKlasse könnte dann bestimmte Bananen produzieren, die Instanzen der ABCBanana Klasse sind , sie wären Objekte vom Typ Banane .

Es ist nicht selten, dass der Programmierer eine einzige und einzige Implementierung für einen Typ bereitstellt. In diesem Fall ist der Klassenname häufig mit dem Typnamen identisch . Es gibt jedoch noch einen Typ (der bei Bedarf in eine Schnittstelle extrahiert werden kann) und eine Implementierung (die die separate Schnittstelle implementieren würde), die Instanzen (Objekte) der Klasse erstellt.

min
quelle
3
Als jemand, der Schwierigkeiten hat zu lernen, ohne ein Beispiel aus der Praxis zu nennen, hat mir das wirklich sehr geholfen. Vielen Dank.
Alexc95
13

Typ ist der Überbegriff für alle verfügbaren Objektvorlagen oder -konzepte. Eine Klasse ist eine solche Objektvorlage. Dies gilt auch für den Strukturtyp, den Integer-Typ, den Schnittstellentyp usw. Dies sind alles Typen

Wenn Sie möchten, können Sie es folgendermaßen betrachten: Ein Typ ist das übergeordnete Konzept. Alle anderen Konzepte: Klasse, Schnittstelle, Struktur, Ganzzahl usw. erben von diesem Konzept. Sie sind Typen

Lonzo
quelle
4

Typ enthält eine Beschreibung der Daten (dh Eigenschaften, Operationen usw.),

Klasse ist ein bestimmter Typ - es ist eine Vorlage zum Erstellen von Instanzen von Objekten .

Genau genommen ist Klasse ein spezielles Konzept. Sie kann als Paket angesehen werden, das eine Teilmenge von Metadaten enthält , die einige Aspekte eines Objekts beschreiben.

In C # finden Sie beispielsweise Schnittstellen und Klassen. Beide sind Typen, aber die Schnittstelle kann nur einen Vertrag definieren und kann im Gegensatz zu Klassen nicht instanziiert werden.

Einfach gesagt, Klasse ist ein spezialisierter Typ, der verwendet wird, um Eigenschaften und Verhalten eines Objekts zu kapseln.

Wikipedia kann Ihnen eine vollständigere Antwort geben:

aku
quelle
4

Um es am schnellsten zu veranschaulichen:

Eine Struktur ist ein Typ, aber eine Struktur ist keine Klasse.

Wie Sie sehen können, ist ein Typ ein "abstrakter" Begriff nicht nur für Definitionen von Klassen, sondern auch für Strukturen und primitive Datentypen wie float, int, bool.

Icelava
quelle
2
Es wäre in Ordnung, die .net-CLR als Beispiel für ein Framework zu erwähnen, in dem es Typen gibt, die keine Klassen sind (Java könnte als ein anderer zitiert werden, obwohl .net mehr Arten von Typen hat). Eine zusätzliche kleine Falte in .net ist jedoch, dass Type(wie gezeigt groß geschrieben) der Kurzname einer Systemklasse ( System.Type) ist, die zur Beschreibung von Typen verwendet wird.
Supercat
3

Typ ist konzeptionell eine Obermenge der Klasse. Im weiteren Sinne ist eine Klasse eine Form des Typs.

Eng verwandt mit Klassen sind Schnittstellen, die als eine ganz besondere Art von Klasse angesehen werden können - eine rein abstrakte. Auch dies sind Typen.

"Typ" umfasst also Klassen, Schnittstellen und in den meisten Sprachen auch Grundelemente. Auch Plattformen wie die Dot-Net-CLR haben Strukturtypen.

Lawrence Dol
quelle
rajKumar, deine frage ist ziemlich zweideutig. Betrachten Sie "Typ" als Merkmal einer Sprache oder als allgemeines Konzept?
Aku
Nicht alle benutzerdefinierten Typen sind Klassen, zumindest nicht in allen Sprachen.
Jalf
Jalf, stimme zu, es ist eine falsche Eigenschaft. Die Benutzeroberfläche ist ebenfalls benutzerdefiniert, und es können keine benutzerdefinierten Typen vorhanden sein. Klasse ist ein spezialisierter Typ, der besonderen Bedürfnissen dient (Erstellen von Instanzen von Objekten)
aku
Eine Schnittstelle ist einfach ein spezieller Typ, eine rein abstrakte Klasse - es ist immer noch ein Typ (im weiteren Sinne).
Lawrence Dol
Software Monkey, Interface ist keine rein abstrakte Klasse - es ist ein spezielles Konzept. "Benutzerdefiniert" ist keine definierende Eigenschaft von Klassen
aku
3

Um ein weiteres Beispiel für die Unterscheidung hinzuzufügen: In C ++ haben Sie Zeiger- und Referenztypen, die auf Klassen verweisen können, aber keine Klassen für sich sind.

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"

Beachten Sie, dass nur eine Klasse beteiligt ist, aber eine nahezu unbegrenzte Anzahl von Typen verwendet werden kann. In einigen Sprachen werden Funktionen als "erstklassige Objekte" betrachtet. In diesem Fall ist der Typ einer Funktion eine Klasse. In anderen Fällen ist der Typ einer Funktion lediglich ein Zeiger. Klassen haben im Allgemeinen das Konzept, Daten speichern zu können, sowie Operationen mit diesen Daten.

Finsternis
quelle
3

Meine Gedanken stimmen ziemlich genau mit Akus Antwort überein.

Ich sehe Klassen als Vorlage zum Erstellen von Objekten, während Typen eine Möglichkeit sind, diese Objekte zu klassifizieren und uns eine Schnittstelle zu ihnen bereitzustellen.

Python fügt auch Metaklassen hinzu, die nur ein Mechanismus zum Erstellen von Klassen sind, genauso wie Klassen Objekte erstellen (und nun, Klassen und Metaklassen sind beide Objekte).

Diese Antwort auf die gleiche Frage in Lamba the Ultimate scheint mir eine perfekte Erklärung zu sein.

Xose Lluis
quelle
3

Entnommen aus dem GoF-Zitat von unten:

Die Klasse eines Objekts definiert, wie das Objekt implementiert wird. Die Klasse definiert den internen Status des Objekts und die Implementierung seiner Operationen.

Im Gegensatz dazu bezieht sich der Typ eines Objekts nur auf seine Schnittstelle - die Gruppe von Anforderungen, auf die es antworten kann.

Ich möchte ein Beispiel mit Java bereitstellen:

public interface IType {
}

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

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

Beide Klassen Aund Bimplementieren die Schnittstelle und sind somit vom Typ IType. Zusätzlich erzeugen beide Klassen in Java ihren eigenen Typ (jeweils zu ihrem Klassennamen). Somit ist die Klasse Avom Typ A und IType und die Klasse Bist vom Typ B und IType befriedigend:

Ein Objekt kann viele Typen haben, und Objekte verschiedener Klassen können denselben Typ haben.

Der Unterschied zwischen Subtypen und Unterklasse hilft wahrscheinlich auch, dieses Problem zu verstehen:

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

SebNag
quelle
2

Ich stelle mir einen Typ als eine Reihe von Dingen vor, die man mit einem bestimmten Wert machen kann. Wenn Sie beispielsweise einen ganzzahligen Wert haben, können Sie ihn anderen Ganzzahlen hinzufügen (oder andere arithmetische Operationen ausführen) oder an Funktionen übergeben, die ein Ganzzahlargument akzeptieren. Wenn Sie einen Objektwert haben, können Sie Methoden aufrufen, die durch seine Klasse definiert sind.

Da eine Klasse definiert, was Sie mit Objekten dieser Klasse tun können, definiert eine Klasse einen Typ. Eine Klasse ist jedoch mehr als das, da sie auch eine Beschreibung der Implementierung der Methoden (etwas, das nicht vom Typ impliziert wird) und der Anordnung der Felder des Objekts enthält.

Beachten Sie auch, dass ein Objektwert nur eine Klasse haben kann, aber mehrere Typen, da jede Oberklasse eine Teilmenge der in der Klasse des Objekts verfügbaren Funktionen bereitstellt.

Obwohl Objekte und Typen eng miteinander verbunden sind, sind sie doch nicht dasselbe.

Jay Conrod
quelle
2

C-Typen wie Int Float, char usw. definieren Daten, auf die mit bestimmten Methoden reagiert werden kann, die sie verarbeiten können. Es ist nicht komplizierter als das. Wie für int kann ich addieren, subtrahieren, multiplizieren und vielleicht dividieren. Das sind meine Methoden (oder Operationen) für int. Eine Klasse ist einfach eine Definition eines neuen Typs. Ich definiere zuerst, wie die Daten aussehen. Vielleicht ist es ein einziges bisschen. Vielleicht sind es zwei Wörter wie ein Komplex mit einem Real- und Imaginärteil. Oder vielleicht ist es dieses komplexe Ding mit 309734325 Bytes, die die atomare Zusammensetzung eines seltsamen Teilchens auf Jupiter darstellen. Es ist mir egal. Genau wie eine Ganzzahl kann ich die Operationen zusammenstellen, die ich mit diesem neuen Datentyp ausführen kann. Bei der Ganzzahl, die ich addieren, subtrahieren usw. musste, kann ich mit diesem neuen Datentyp alle Operationen definieren, die ich für sinnvoll halte. Sie können addieren subtrahieren usw. aber sie können andere Dinge hinzufügen. Dies sind alle Methoden, die ich meiner Klasse hinzufügen möchte.

Die Quintessenz ist, dass Sie mit einem Typ in C eine Definition der Daten haben, dh; ein Byte, ein Wort, ein Gleitkomma, ein Zeichen usw. Aber jede dieser Aussagen impliziert auch, welche Operationen legal sind und zuverlässige Ergebnisse liefern.

Eine Klasse ist nicht anders, außer es liegt an Ihnen, die Schnittstelle und akzeptable Operationen zu definieren. Die Klasse definiert diese Dinge und wenn Sie sie in einem Objekt instanziieren, definiert sie das Verhalten des Objekts, genau wie eine Typdefinition das Verhalten einer Ganzzahl definiert, wenn Sie daran arbeiten.

Klassen geben Ihnen nur die Flexibilität, neue Typen und alles über ihre Funktionsweise zu definieren.

Sobald dies definiert ist, hat es jedes Mal, wenn ich ein Objekt der Klasse "thingy" instanziiere, die von mir definierte Datenstruktur und die Operationen (Methoden), von denen ich sagte, dass Sie damit arbeiten können. Die Klasse "thingy" ist eindeutig nichts anderes als ein neuer Typ, den ich in C ++ definieren kann.

Aaron Bauch
quelle
1

Typ bezieht sich im Allgemeinen auf die Klassifizierung primitiver Werte - Ganzzahlen, Zeichenfolgen, Arrays, Boolesche Werte, Null usw. Normalerweise können Sie keine neuen Typen erstellen.

Klasse bezieht sich auf den benannten Satz von Eigenschaften und Methoden, denen ein Objekt beim Erstellen zugeordnet ist. Normalerweise können Sie so viele neue Klassen definieren, wie Sie möchten. In einigen Sprachen müssen Sie jedoch ein neues Objekt erstellen und dann Methoden an dieses anhängen.

Diese Definition ist größtenteils richtig, aber einige Sprachen haben versucht, Typen und Klassen auf verschiedene Weise zu kombinieren, mit verschiedenen vorteilhaften Ergebnissen.

zu viel php
quelle
1
Selbst in der vom Typ verarmten Sprache C können Sie neue Typen erstellen, aber es gibt nichts Vergleichbares zu dem, was die Leute normalerweise als Klassen betrachten, außer insofern, als Strukturen, Datensätze und Klassen sich irgendwie ähneln.
James Iry
1

Typen und Klassen sind verwandt, aber nicht identisch. Meiner Meinung nach werden Klassen für die Vererbung der Implementierung verwendet, während Typen für die Laufzeitersetzung verwendet werden.

Hier ist ein Link, der das Substitutionsprinzip erklärt und erklärt, warum Unterklassen und Subtypen nicht immer dasselbe sind (zum Beispiel in Java). Auf der Wikipedia- Seite zu Kovarianz und Kontravarianz finden Sie weitere Informationen zu dieser Unterscheidung.

Doug Currie
quelle
1

Im allgemeinen sprachunabhängigen Sinn - Klasse ist eine Verwirklichung des Typs .

Wenn dies die einzige Realisierung dieses Typs ist, können Sie häufig beide Begriffe verwenden, um in einem bestimmten Kontext darauf zu verweisen.

Im Gegenteil, beispielsweise in C # Kontext - Klasse ist nur eine der vielen anderen Implementierungen eines Typ - Konzept wie Primitiven, Strukturen, Zeiger usw.

Sevenate
quelle
0

Interessante Frage. Ich denke, Akus Antwort ist genau richtig. Nehmen Sie ArrayListals Beispiel die Java- Klasse

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

Eine Instanz der ArrayListKlasse soll vom Typ jeder erweiterten Superklasse und jeder implementierten Schnittstelle sein. Daher ist es eine Instanz der ArrayListhat Klasse A - Typ ArrayList, RandomAccess, Cloneableund so weiter. Mit anderen Worten, Werte (oder Instanzen) gehören zu einem oder mehreren Typen. Klassen definieren, was diese Typen sind.

Armandino
quelle
0

Verschiedene Klassen können denselben Typ beschreiben.

Typ besteht aus diesen Teilen:

  1. Operationen = Syntax
  2. Beschreibung der Operationen = Semantik

Klasse besteht aus diesen Teilen:

  1. Operationen = Syntax
  2. Implementierung (= verschiedene Implementierungen beschreiben dieselbe Semantik)

Einige Notizen:

  • Die Schnittstelle (wie in Java) ist kein Typ, da sie keine Semantik beschreibt (beschreibt nur die Syntax).

  • Die Unterklasse ist kein Subtyp, da die Unterklasse die in der Oberklasse definierte Semantik ändern kann. Der Subtyp kann die Semantik des Supertyps nicht ändern (siehe Liskov-Substitutionsprinzip, z. B. dieses LSP-Beispiel ).

jk_
quelle
0

Da es Sprachen mit Typsystem gibt, die keine OO-Programmiersprachen sind, muss Typ natürlich ein umfassenderes Konzept als Klasse sein

Auch in Sprachen wie Java intist ein (primitiver) Typ, aber keine Klasse.

Daher: Jede Klasse ist ein Typ, aber nicht jeder Typ ist eine Klasse.

Ingo
quelle
0

Wenn wir diese Frage im C # -Kontext betrachten, erreichen wir die folgende Antwort.

Das System vom Typ C # ist in folgende Kategorien unterteilt:

Werttypen:

  • Einfache Typen: wie int, long, float usw.
  • Aufzählungstypen
  • Strukturtypen
  • Nullable Typen

Referenztypen:

  • Klassentypen
  • Schnittstellentypen
  • Array-Typen
  • Delegiertypen

Wie Sie sehen können, gibt es in C # viele Typen, von denen die Klasse nur einer ist. Es gibt nur einen wichtigen Hinweis: Das Typensystem von C # ist so vereinheitlicht, dass ein Wert eines beliebigen Typs als Objekt behandelt werden kann. Jeder Typ in C # leitet sich direkt oder indirekt vom Objektklassentyp ab, und object ist die ultimative Basisklasse aller Typen. Werte von Referenztypen werden einfach als Objekte behandelt, indem die Werte als Typobjekt angezeigt werden. Werte von Werttypen werden durch Ausführen von Box- und Unboxing-Vorgängen als Objekte behandelt.

Wie ich sehe, ist Typ ein Regenschirm über viele Elemente, deren Klasse eine davon ist.

Referenz: Dokument zur CSahrp-Sprachspezifikation, Seite 4

Amirreza
quelle
-1

Dies war eine gute Frage für mich, die mich zum Nachdenken brachte. Ich würde es wagen zu sagen, dass Class ein Compiletime-Ding und Type ein Runtime-Ding ist. Ich sage das, weil Sie Klassen schreiben, keine Typen. Der Compiler erstellt dann Typen aus Klassen, und die Laufzeit verwendet Typen, um Instanzen von Objekten zu erstellen.

Denk nochmal
quelle
1
Willkommen bei SO. Diese Antwort ist mindestens einer sehr ähnlich und SO-Benutzer bevorzugen mehr technische Sprache als "Ding"!
Nick