it-swarm.com.de

Was ist der Unterschied zwischen Typ und Klasse?

Was unterscheidet einen Typ von Klasse und umgekehrt?

(Im allgemeinen sprachunabhängigen Sinne)

134
yesraaj

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

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

111
yesraaj

Ich stelle mir einen Typ immer als Überbegriff für "Klassen" und "Primitive" vor.

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

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

54
Eddie Parker

Inspiriert von Wikipedia ...

In Typentheorie Ausdrücken;

  • 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 handelt sich um eine konkrete Datenstruktur und Sammlung von Unterprogrammen

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

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

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

enter image description here

Das Bananenbeispiel.

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

  • Die Klassen ABCBanana und XYZBanana class repräsentieren Möglichkeiten zur Herstellung von Bananen.
    (Unterschiedliche Bananenlieferanten im wirklichen Leben oder unterschiedliche Datenstrukturen und Funktionen zum Darstellen und Zeichnen von Bananen in einem Videospiel).

    Die Klasse ABCBanana könnte dann bestimmte Bananen erzeugen, die Instanzen der Klasse ABCBanana Klasse, das wären Objekte Typ Banane .

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

40
mins

Typ ist der Überbegriff für alle verfügbaren Objektvorlagen oder Konzepte. Eine Klasse ist eine solche Objektvorlage. Ebenso der Strukturtyp, der Integer-Typ, der Interface-Typ 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

13
Lonzo

Der Typ enthält eine Beschreibung der Daten (d. H. Eigenschaften, Operationen usw.).

Class ist ein bestimmter Typ - es ist eine Vorlage zum Erstellen von Instanzen von objects .

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

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

Einfach ausgedrückt ist class ein spezialisierter Typ , der verwendet wird, um Eigenschaften und Verhalten von ein Objekt.

Wikipedia kann Ihnen eine vollständigere Antwort geben:

4
aku

Um es am schnellsten zu veranschaulichen:

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

Wie Sie sehen, ist ein Typ ein "abstrakter" Begriff, der nicht nur Definitionen von Klassen, sondern auch Strukturen und primitive Datentypen wie float, int, bool enthält.

4
icelava

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 scheint mir das Ultimative eine perfekte Erklärung zu sein.

3
Xose Lluis

Entnommen aus dem GoF-Zitat von unten:

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

Im Gegensatz dazu bezieht sich der Typ eines Objekts nur auf seine Schnittstelle - die Menge 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 das Interface und sind somit vom Typ IType. Zusätzlich erzeugen beide Klassen in Java ihren eigenen Typ (bzw. ihren Klassennamen). Somit ist die Klasse A vom Typ A und IType und die Klasse B ist vom Typ B und IType und erfüllt:

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

Der Unterschied zwischen Untertypen und Unterklassen hilft wahrscheinlich auch, dieses Problem zu verstehen:

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

3
SebNag

Typ ist konzeptionell eine Obermenge der Klasse. Im weiteren Sinne ist eine Klasse eine Art von Typ.

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

"Typ" umfasst also Klassen, Interfaces und in den meisten Sprachen auch Primitive. Auch Plattformen wie die dot-net CLR haben Strukturtypen.

3
Lawrence Dol

Um ein weiteres Unterscheidungsbeispiel hinzuzufügen: In C++ gibt es Zeiger- und Referenztypen, die sich auf Klassen beziehen 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"

Es ist zu beachten, dass nur eine Klasse beteiligt ist, jedoch eine nahezu unendliche Anzahl von Typen verwendet werden kann. In einigen Sprachen werden Funktionen als "First-Class-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 sowie Operationen mit diesen Daten zu speichern.

2
Eclipse

Ich stelle mir einen Typ als die Menge von Dingen vor, die Sie mit einem bestimmten Wert tun können. Wenn Sie beispielsweise einen ganzzahligen Wert haben, können Sie ihn anderen Ganzzahlen hinzufügen (oder andere arithmetische Operationen ausführen) oder ihn an Funktionen übergeben, die ein ganzzahliges Argument akzeptieren. Wenn Sie einen Objektwert haben, können Sie Methoden für diesen 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 beschreibt, wie die Methoden implementiert sind (was vom Typ nicht impliziert wird) und wie die Felder des Objekts angeordnet sind.

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

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

1
Jay Conrod

Typ bezieht sich im Allgemeinen auf die Klassifizierung von Grundwerten - Ganzzahlen, Zeichenfolgen, Arrays, Boolesche Werte, Nullen 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 wird. 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 anschließend Methoden an dieses anhängen.

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

1
too much php

Typen und Klassen sind verwandt, aber nicht identisch. Ich gehe davon aus, dass Klassen für die Vererbung der Implementierung verwendet werden, während Typen für die Laufzeitersetzung verwendet werden.

Hier ist ein Link, der das Substitutionsprinzip erklärt und warum Unterklassen und Subtypen nicht immer dasselbe sind (in Java zum Beispiel.) Die wikipedia Seite über Kovarianz und Kontravarianz enthält weitere Informationen zu dieser Unterscheidung.

1
Doug Currie

Wenn wir diese Frage im C # -Kontext beantworten, erhalten 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:

  • Klassenarten
  • Schnittstellentypen
  • Array-Typen
  • Typen delegieren

Wie Sie sehen, gibt es in C # viele Typen, von denen Class 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 als Objekte behandelt, indem die Werte einfach als Typobjekt angezeigt werden. Werte von Werttypen werden als Objekte behandelt, indem Boxing- und Unboxing-Vorgänge ausgeführt werden.

so wie ich sehe, ist Typ ein Regenschirm über vielen Gegenständen, welche Klasse eine davon ist.

Referenz: CSahrp Language Specification doc, Seite 4

0
Amirreza

Verschiedene Klassen können den gleichen Typ beschreiben.

Typ besteht aus diesen Teilen:

  1. Operationen = Syntax
  2. Operationsbeschreibung = Semantik

Klasse besteht aus diesen Teilen:

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

Einige Notizen:

  • Interface (wie in Java) ist kein Typ, da es keine Semantik beschreibt (beschreibt nur die Syntax)

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

0
jk_

In allgemein sprachunabhängig Sinn - Klasse ist eine Verwirklichung der Typ .

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

Im Gegenteil, zum Beispiel ist in C # -Kontext - -Klasse nur eins des viel mehr) Implementierungen eines Typs wie Primitive, Strukturen, Zeiger usw.

0
Sevenate

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 ist und Type ein Runtime-Ding. 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.

0
ThinkAgain

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

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

Eine Instanz der Klasse ArrayList soll vom Typ jeder von ihr erweiterten Superklasse und jeder von ihr implementierten Schnittstelle sein. Daher hat eine Instanz der Klasse ArrayList den Typ ArrayList, RandomAccess, Cloneable usw. Mit anderen Worten, Werte (oder Instanzen) gehören zu einem oder mehreren Typen. Klassen definieren, was diese Typen sind.

0
armandino

Da es Sprachen mit Typsystem gibt, die keine OO Programmiersprachen sind, muss Typ ein breiteres Konzept als Klasse sein

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

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

0
Ingo

C-Typen wie Int Float, char usw. definieren Daten, auf die mit bestimmten Methoden reagiert werden kann, die auf sie angewendet werden 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 Real- und Imaginärteil. Oder vielleicht ist es dieses komplexe Ding mit 309734325 Bytes, das den atomaren Aufbau eines seltsamen Partikels auf Jupiter darstellt. Ist mir egal Genau wie eine Ganzzahl kann ich die Operationen ausarbeiten, die ich mit diesem neuen Datentyp ausführen kann. Im Fall der Ganzzahl, die ich addieren, subtrahieren usw. musste. Mit diesem neuen Datentyp kann ich definieren, welche Operationen ich für sinnvoll halte. Sie können Addieren, Subtrahieren usw. sein, aber sie können andere Dinge hinzufügen. Dies sind die 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, Word, Float, Char usw. Jede dieser Angaben impliziert jedoch auch, welche Operationen zulässig sind und zuverlässige Ergebnisse liefern.

Eine Klasse ist nicht anders, es sei denn, Sie müssen die Schnittstelle und die zulässigen Operationen 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 zu definieren und alles darüber, wie sie funktionieren.

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

0
Aaron Bauch