Antworten:
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.
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
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 .
Das Bananenbeispiel.
Ein
Banana
Typ würde die Eigenschaften und die Funktionalität von Bananen im Allgemeinen darstellen.Die Klassen
ABCBanana
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
ABCBanana
Klasse könnte dann bestimmte Bananen produzieren, die Instanzen derABCBanana
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.
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
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:
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.
Type
(wie gezeigt groß geschrieben) der Kurzname einer Systemklasse ( System.Type
) ist, die zur Beschreibung von Typen verwendet wird.
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.
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.
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.
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 A
und B
implementieren 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 A
vom Typ A
und IType
und die Klasse B
ist 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
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.
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.
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.
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.
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.
Interessante Frage. Ich denke, Akus Antwort ist genau richtig. Nehmen Sie ArrayList
als Beispiel die Java- Klasse
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Eine Instanz der ArrayList
Klasse soll vom Typ jeder erweiterten Superklasse und jeder implementierten Schnittstelle sein. Daher ist es eine Instanz der ArrayList
hat Klasse A - Typ ArrayList
, RandomAccess
, Cloneable
und so weiter. Mit anderen Worten, Werte (oder Instanzen) gehören zu einem oder mehreren Typen. Klassen definieren, was diese Typen sind.
Verschiedene Klassen können denselben Typ beschreiben.
Typ besteht aus diesen Teilen:
Klasse besteht aus diesen Teilen:
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 ).
Wenn wir diese Frage im C # -Kontext betrachten, erreichen wir die folgende Antwort.
Das System vom Typ C # ist in folgende Kategorien unterteilt:
Werttypen:
Referenztypen:
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
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.