Réponses:
La réponse suivante est tirée du livre Gof ( Design Patterns )
La classe d' un objet définit la façon dont l'objet est implémenté. La classe définit l'état interne de l'objet et l'implémentation de ses opérations.
En revanche, le type d' un objet se réfère uniquement à son interface - un ensemble de requêtes auxquelles il peut répondre.
Un objet peut avoir plusieurs types et les objets de différentes classes peuvent avoir le même type.
//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
}
La fonction max nécessite un type avec operation> avec son propre type comme interface. Toute classe qui satisfait à l'exigence ci-dessus peut être utilisée pour générer une fonction max spécifique pour cette classe.
Je pense toujours à un «type» comme un terme générique pour «classes» et «primitives».
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
Inspiré de Wikipedia ...
En termes de théorie des types ;
Un type est une interface abstraite.
Les types représentent généralement des noms, comme une personne, un lieu ou une chose, ou quelque chose de nominalisé,
Une classe représente une implémentation du type.
C'est une structure de données concrète et une collection de sous-programmes
Différentes classes concrètes peuvent produire des objets du même type abstrait (selon le système de types).
* Par exemple, on peut implémenter le type Stack
avec deux classes : SmallStack
(rapide pour les petits stacks, mais évolue mal) et ScalableStack
(évolue bien mais avec une surcharge élevée pour les petits stacks). *
De même, une classe donnée peut avoir plusieurs constructeurs différents .
L'exemple de la banane.
Un
Banana
type représenterait les propriétés et la fonctionnalité des bananes en général.Les classes
ABCBanana
et représenteraient des moyens de produire des bananes. (Différents fournisseurs de bananes dans la vraie vie, ou différentes structures de données et fonctions pour représenter et dessiner des bananes dans un jeu vidéo).XYZBanana
La
ABCBanana
classe pourrait alors produire des bananes particulières qui sont des instances de laABCBanana
classe , ce seraient des objets de type Banana .
Il n'est pas rare que le programmeur fournisse une seule et unique implémentation pour un type. Dans ce cas, le nom de la classe est souvent identique au nom du type . Mais il existe toujours un type (qui pourrait être extrait dans une interface si nécessaire), et une implémentation (qui implémenterait l'interface séparée) qui construit des instances (objets) de la classe.
Type est le terme générique pour tous les modèles ou concepts d'objets disponibles. Une classe est l'un de ces modèles d'objet. Il en va de même pour le type de structure, le type entier, le type d'interface, etc. Ce sont tous des types
Si vous le souhaitez, vous pouvez le voir de cette façon: Un type est le concept parent. Tous les autres concepts: Classe, Interface, Structure, Entier etc. héritent de ce concept.Ils sont des types
Le type contient la description des données (c.-à-d. Propriétés, opérations, etc.),
La classe est un type spécifique - c'est un modèle pour créer des instances d' objets .
À proprement parler, la classe est un concept spécial, elle peut être vue comme un paquet contenant un sous-ensemble de métadonnées décrivant certains aspects d'un objet.
Par exemple, en C #, vous pouvez trouver des interfaces et des classes. Les deux sont des types, mais l'interface ne peut définir que certains contrats et ne peut pas être instanciée contrairement aux classes.
La classe pour parler simplement est un type spécialisé utilisé pour encapsuler les propriétés et le comportement d'un objet.
Wikipédia peut vous donner une réponse plus complète:
Pour l'illustrer de la manière la plus rapide:
Une structure est un type, mais une structure n'est pas une classe.
Comme vous pouvez le voir, un Type est un terme «abstrait» non seulement pour les définitions de classes, mais aussi pour les structures et les types de données primitifs comme float, int, bool.
Type
(en majuscule comme indiqué) est le nom court d'une classe système ( System.Type
) qui est utilisée pour contenir les descriptions de types.
Le type est conceptuellement un sur-ensemble de classe. Au sens large, une classe est une forme de type.
Les interfaces sont étroitement liées aux classes, qui peuvent être considérées comme un type de classe très spécial - une classe purement abstraite. Ce sont aussi des types.
Le "type" englobe donc les classes, les interfaces et dans la plupart des langages les primitives aussi. Les plates-formes telles que le CLR dot-net ont également des types de structure.
Pour ajouter un autre exemple de distinction: en C ++, vous avez des types pointeur et référence qui peuvent faire référence à des classes, mais ne sont pas des classes en elles-mêmes.
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"
Notez qu'une seule classe est impliquée, mais un nombre presque infini de types peut être utilisé. Dans certains langages, les fonctions sont considérées comme des "objets de première classe", auquel cas le type d'une fonction est une classe. Dans d'autres, le type d'une fonction est simplement un pointeur. Les classes ont généralement le concept de pouvoir contenir des données, ainsi que des opérations sur ces données.
Mes pensées correspondent à peu près à la réponse d'aku.
Je vois les classes comme un modèle pour la construction d'objets, tandis que les types sont un moyen de classer ces objets et de nous fournir une interface avec eux.
Python ajoute également des métaclasses, qui ne sont qu'un mécanisme pour construire des classes, de la même manière que les classes construisent des objets (et bien, les classes et les métaclasses sont toutes deux des objets).
Cette réponse à la même question en lamba l'ultime me semble une explication parfaite.
Tiré de la citation du GoF ci-dessous:
Une classe d'objets définit comment l'objet est implémenté. La classe définit l'état interne de l'objet et l'implémentation de ses opérations.
En revanche, le type d' un objet se réfère uniquement à son interface - l'ensemble des requêtes auxquelles il peut répondre.
Je veux donner un exemple utilisant Java:
public interface IType {
}
public class A implements IType {
public A{};
}
public class B implements IType {
public B{};
}
Les deux classes A
et B
implémentent l'interface et sont donc du type IType
. De plus, en Java, les deux classes produisent leur propre type (respectivement à leur nom de classe). Ainsi la classe A
est de type A
et IType
et la classe B
est de type B
et IType
satisfaisante:
Un objet peut avoir plusieurs types et les objets de différentes classes peuvent avoir le même type.
La différence entre les sous-types et la sous-classe aide probablement à comprendre également ce problème:
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
Je pense qu'un type est l'ensemble des choses que vous pouvez faire avec une valeur particulière. Par exemple, si vous avez une valeur entière, vous pouvez l'ajouter à d'autres entiers (ou effectuer d'autres opérations arithmétiques), ou la transmettre à des fonctions qui acceptent un argument entier. Si vous avez une valeur d'objet, vous pouvez y appeler des méthodes définies par sa classe.
Étant donné qu'une classe définit ce que vous pouvez faire avec les objets de cette classe, une classe définit un type. Une classe est bien plus que cela, car elle fournit également une description de la façon dont les méthodes sont implémentées (quelque chose qui n'est pas impliqué par le type) et comment les champs de l'objet sont disposés.
Notez également qu'une valeur d'objet ne peut avoir qu'une seule classe, mais elle peut avoir plusieurs types, car chaque superclasse fournit un sous-ensemble des fonctionnalités disponibles dans la classe de l'objet.
Ainsi, bien que les objets et les types soient étroitement liés, ils ne sont vraiment pas la même chose.
Les types en C, comme Int Float, char, etc. définissent des données sur lesquelles il est possible d'agir avec des méthodes spécifiques qui peuvent les utiliser. Ce n'est pas plus compliqué que ça. Comme pour int, je peux ajouter, soustraire multiplier et peut-être diviser. Ce sont mes méthodes (ou opérations) pour int. Une classe est simplement une définition d'un nouveau type. Je définis d'abord à quoi ressemblent les données. Peut-être que c'est un peu. C'est peut-être deux mots comme un complexe avec une partie réelle et imaginaire. Ou peut-être que c'est ce truc complexe avec 309734325 octets représentant la composition atomique d'une particule étrange sur Jupiter. Je m'en fiche. Tout comme un entier, j'arrive à créer les opérations que je peux faire avec ce nouveau type de données. Dans le cas de l'entier, j'ai ajouté, soustrait, etc. Ils pourraient être ajouter soustraire etc. mais ils peuvent ajouter d'autres choses. Ce sont les méthodes que je décide d'ajouter à ma classe.
L'essentiel est qu'avec un type en C, vous avez une définition de ce que sont les données, c'est-à-dire; un octet, un mot, un flottant, un caractère, etc. Mais tout cela implique également quelles opérations sont légales et produiront des résultats fiables.
Une classe n'est pas différente sauf qu'il vous appartient de définir l'interface et les opérations acceptables. La classe définit ces choses et lorsque vous l'instanciez dans un objet, elle définit le comportement de l'objet, tout comme une définition de type définit le comportement d'un entier lorsque vous opérez dessus.
Les classes vous donnent simplement la flexibilité de définir de nouveaux types et tout ce qui concerne leur fonctionnement.
Une fois que cela est défini, chaque fois que j'instancie un objet de la classe "thingy", il a la structure de données que j'ai définie et les opérations (méthodes) que j'ai dit que vous pouvez faire avec. La classe "thingy" n'est clairement ni plus ni moins qu'un nouveau type que C ++ me laisse définir.
Type fait généralement référence à la classification des valeurs primitives - entiers, chaînes, tableaux, booléens, null, etc. Habituellement, vous ne pouvez pas créer de nouveaux types.
Classe fait référence à l'ensemble nommé de propriétés et de méthodes auquel un objet est associé lors de sa création. Vous pouvez généralement définir autant de nouvelles classes que vous le souhaitez, bien que dans certains langages, vous deviez créer un nouvel objet et y attacher des méthodes.
Cette définition est généralement vraie, mais certains langages ont tenté de combiner des types et des classes de diverses manières, avec divers résultats bénéfiques.
Les types et les classes sont liés mais pas identiques. Je pense que les classes sont utilisées pour l'héritage d'implémentation, alors que les types sont utilisés pour la substitution d'exécution.
Voici un lien expliquant le principe de substitution et pourquoi les sous-classes et sous-types ne sont pas toujours la même chose (en Java par exemple). La page wikipedia sur la covariance et la contravariance contient plus d'informations sur cette distinction.
Au sens général indépendant de la langue - La classe est une réalisation du Type .
Souvent, lorsqu'il s'agit de la seule réalisation de ce type, vous pouvez utiliser les deux termes pour y faire référence dans un certain contexte.
Au contraire, par exemple, dans le contexte C #, la classe n'est que l' une des nombreuses autres implémentations d'un concept de type telles que les primitives, les structures, les pointeurs, etc.
Question interessante. Je pense que la réponse d'aku est parfaite. Prenez la ArrayList
classe java comme exemple
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
On dit qu'une instance de la ArrayList
classe est du type de chaque superclasse qu'elle étend et de chaque interface qu'elle implémente. Par conséquent, une instance de la ArrayList
classe a un type ArrayList
, RandomAccess
, Cloneable
et ainsi de suite. En d'autres termes, les valeurs (ou instances) appartiennent à un ou plusieurs types, les classes définissent ce que sont ces types.
Différentes classes peuvent décrire le même type.
Le type se compose de ces parties:
La classe se compose de ces parties:
Quelques notes:
L'interface (comme en Java) n'est pas de type, car elle ne décrit pas la sémantique (ne décrit que la syntaxe)
La sous-classe n'est pas un sous-type, car la sous-classe peut changer la sémantique définie dans la superclasse, le sous-type ne peut pas changer la sémantique du supertype (voir le principe de substitution de Liskov, par exemple cet exemple de LSP ).
Évidemment, comme il existe des langages avec un système de type qui ne sont pas des langages de programmation OO, le type doit être un concept plus large que la classe
Même dans des langages comme Java, int
est un type (primitif), mais pas une classe.
Par conséquent: chaque classe est un type, mais tous les types ne sont pas une classe.
Si nous pensons à cette question dans un contexte C #, nous atteignons la réponse ci-dessous.
Le système de type C # est divisé en catégories suivantes:
Types de valeur:
Types de référence:
Comme vous pouvez le voir, il existe de nombreux types en C #, dont la classe n'est que l'un d'entre eux. Il y a juste une remarque importante: le système de types de C # est unifié de telle sorte qu'une valeur de n'importe quel type peut être traitée comme un objet. Chaque type en C # dérive directement ou indirectement du type de classe d'objet, et object est la classe de base ultime de tous les types. Les valeurs des types de référence sont traitées comme des objets simplement en affichant les valeurs comme objet de type. Les valeurs des types de valeur sont traitées comme des objets en effectuant des opérations de mise en boîte et de déballage.
donc comme je le vois, le type est un parapluie sur de nombreux éléments dont la classe est l'un d'entre eux.
Référence: document de spécification du langage CSahrp, page 4
C'était une bonne question pour moi, qui m'a fait réfléchir. J'oserais dire que Class est un truc de compilation et que Type est un truc d'exécution. Je dis cela parce que vous écrivez des classes et non des types. Le compilateur crée ensuite des types à partir de classes et le runtime utilise des types pour créer des instances d'objets.