Quelle est la différence entre le type et la classe?

153

Qu'est-ce qui différencie un type de la classe et vice versa?

(Au sens général indépendant de la langue)

yesraaj
la source
3
C ++ efficace, élément 19: Traitez la conception de classe comme une conception de type.
Brent81

Réponses:

121

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.

yesraaj
la source
56

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

Eddie Parker
la source
7
explication agréable et concise :)
aku
3
Eh bien, dans .NET, cela devrait être la même chose, même les primitives sont des classes (ou plus exactement des structs).
dalle le
4
@dalle: d'accord, il n'y a pas de différence inhérente entre le type et la classe. L'exemple d'Eddie est très dépendant de C ++ / Java. Ce n'est pas du tout LA définition.
Robert Gould
J'imagine qu'il sera difficile d'obtenir "LA" définition d'un "type" par rapport à une classe. Tant de langues ont leur propre système de frappe. Une définition que j'ai entendue pour .NET était qu'un «type» inclut à la fois les types ref et value, alors qu'une classe n'est utilisée que pour décrire les types ref.
Eddie Parker le
2
Int n'est-il pas juste un raccourci pour System.Int32? En d'autres termes: int foo; // Le type est int, la classe est System.Int32?
Svish
51

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 .

entrez la description de l'image ici

L'exemple de la banane.

  • Un Banana type représenterait les propriétés et la fonctionnalité des bananes en général.

  • Les classesABCBanana 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 ABCBananaclasse pourrait alors produire des bananes particulières qui sont des instances de la ABCBanana 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.

minutes
la source
3
En tant que personne qui a du mal à apprendre à moins de donner un exemple réel, cela m'a vraiment, vraiment aidé. Merci.
alexc95
13

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

Lonzo
la source
4

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:

aku
la source
4

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.

icelava
la source
2
Ce serait bien de mentionner le .net CLR comme exemple de cadre dans lequel il existe des types qui ne sont pas des classes (Java pourrait être cité comme un autre, bien que .net ait plus de types de types). Une petite ride supplémentaire dans .net, cependant, est que 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.
supercat
3

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.

Lawrence Dol
la source
rajKumar, votre question est assez ambiguë. faites-vous autant de "type" comme caractéristique d'une langue ou comme concept général?
aku
Cependant, tous les types définis par l'utilisateur ne sont pas des classes, du moins pas dans toutes les langues.
jalf
jalf, d'accord, ce sont de mauvaises caractéristiques. L'interface est également définie par l'utilisateur et il ne peut y avoir aucun type défini par l'utilisateur. La classe est un type spécialisé répondant à des besoins spéciaux (création d'instances d'objets)
aku
Une interface est simplement un type spécial, une classe purement abstraite - c'est toujours un type (au sens large).
Lawrence Dol
Software Monkey, l'interface n'est pas une classe purement abstraite - c'est un concept spécial. "défini par l'utilisateur" n'est pas une propriété déterminante des classes
aku
3

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.

Éclipse
la source
3

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.

Xose Lluis
la source
3

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 Aet Bimplé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 Aest de type A et IType et la classe Best 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

SebNag
la source
2

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.

Jay Conrod
la source
2

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.

Aaron Bauch
la source
1

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.

trop de php
la source
1
Même dans le langage appauvri de types C, vous pouvez créer de nouveaux types, mais cela n'a rien à voir avec ce que les gens considèrent normalement comme des classes, sauf dans la mesure où les structures, les enregistrements et les classes se ressemblent tous.
James Iry
1

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.

Doug Currie
la source
1

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.

Sevenate
la source
0

Question interessante. Je pense que la réponse d'aku est parfaite. Prenez la ArrayListclasse 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 ArrayListclasse est du type de chaque superclasse qu'elle étend et de chaque interface qu'elle implémente. Par conséquent, une instance de la ArrayListclasse a un type ArrayList, RandomAccess, Cloneableet 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.

Armandino
la source
0

Différentes classes peuvent décrire le même type.

Le type se compose de ces parties:

  1. Opérations = syntaxe
  2. Description des opérations = sémantique

La classe se compose de ces parties:

  1. Opérations = syntaxe
  2. Implémentation (= diverses implémentations décrivent la même sémantique)

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 ).

jk_
la source
0

É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, intest un type (primitif), mais pas une classe.

Par conséquent: chaque classe est un type, mais tous les types ne sont pas une classe.

Ingo
la source
0

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 simples: comme int, long, float, etc.
  • Types d'énumération
  • Types de structure
  • Types nulles

Types de référence:

  • Types de cours
  • Types d'interface
  • Types de tableaux
  • Types de délégués

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

Amirreza
la source
-1

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.

Pensez à nouveau
la source
1
Bienvenue à SO. Cette réponse est très similaire à au moins une autre et les utilisateurs SO préfèrent un langage plus technique que «truc»!
Nick