web-dev-qa-db-fra.com

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

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

(Au sens général de la langue agnostique)

134
yesraaj

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 la mise en œuvre de ses opérations.

En revanche, le type d'un objet fait uniquement référence à son interface - un ensemble de requêtes auxquelles il peut répondre.

Un objet peut avoir plusieurs types et des 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 opération> avec son propre type comme interface de n'importe quelle classe qui satisfait à l'exigence ci-dessus peut être utilisée pour générer une fonction max spécifique pour cette classe.

111
yesraaj

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

54
Eddie Parker

Inspiré par Wikipedia ...

En théorie des types termes;

  • 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 pourrait implémenter le typeStack avec deux classes: SmallStack (rapide pour les petites piles, mais échelles mal) et ScalableStack (échelles bien mais frais généraux élevés pour les petites piles). *

    De même, une classe donnée peut avoir plusieurs constructeurs différents .

enter image description here

L'exemple de la banane.

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

  • Les ABCBanana et XYZBanana classes représenteraient des façons de produire des bananes.
    (Différents fournisseurs de bananes dans la vie réelle, ou différentes structures de données et fonctions pour représenter et dessiner des bananes dans un jeu vidéo).

    La classe ABCBanana pourrait alors produire des bananes particulières qui sont instances du ABCBanana classe, ils seraient objets sur type Banane .

Il n'est pas rare que le programmeur fournisse une seule et unique implémentation pour un type. Dans ce cas, le nom class est souvent identique au nom type. Mais il y a 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.

40
mins

Type est le terme générique pour tous les modèles ou concepts d'objet 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.i.e Ce sont des types

13
Lonzo

Le type contient la description des données (c'est-à-dire les propriétés, les opérations, etc.),

La classe est un type spécifique - c'est un modèle pour créer des instances de objets .

À proprement parler, la classe est un concept spécial, elle peut être considérée comme un package 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.

Pour parler simplement , la classe est un type spécialisé utilisé pour encapsuler les propriétés et le comportement de un objet.

Wikipedia peut vous donner une réponse plus complète:

4
aku

Pour l'illustrer de la manière la plus rapide:

Un Struct est un Type, mais un Struct n'est pas une Classe.

Comme vous pouvez le voir, un Type est un terme "abstrait" pour non seulement les définitions de classes, mais aussi les structures et les types de données primitifs comme float, int, bool.

4
icelava

Mes pensées sont à peu près conformes à 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 les deux objets).

Cette réponse à la même question dans lamba l'ultime me semble être une explication parfaite.

3
Xose Lluis

Tiré de la citation du GoF ci-dessous:

La classe d'un objet définit la manière dont l'objet est implémenté. La classe définit l'état interne de l'objet et la mise en œuvre de ses opérations.

En revanche, le type d'un objet fait uniquement référence à son interface, l'ensemble des requêtes auxquelles il peut répondre.

Je veux fournir un exemple en 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 de type IType. De plus, en Java, les deux classes produisent leur propre type (respectivement avec leur nom de classe). Ainsi la classe A est de type A et IType et la classe B est de type B et IType satisfaisant:

Un objet peut avoir plusieurs types et des 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

3
SebNag

Le type est conceptuellement un surensemble 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 - purement abstrait. Ce sont aussi des types.

Ainsi, "type" englobe les classes, les interfaces et dans la plupart des langues les primitives aussi. Les plates-formes comme le CLR dot-net ont également des types de structure.

3
Lawrence Dol

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 qui ne sont pas des classes en soi.

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 n'est qu'un pointeur. Les classes ont généralement les concepts de pouvoir contenir des données, ainsi que des opérations sur ces données.

2
Eclipse

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 passer à des fonctions qui acceptent un argument entier. Si vous avez une valeur d'objet, vous pouvez appeler des méthodes qui sont définies par sa classe.

Parce 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, ce n'est vraiment pas la même chose.

1
Jay Conrod

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 devez créer un nouvel objet, puis y attacher des méthodes.

Cette définition est généralement vraie, mais certaines langues ont tenté de combiner les types et les classes de diverses manières, avec divers résultats bénéfiques.

1
too much php

Les types et les classes sont liés mais pas identiques. Mon point de vue est que les classes sont utilisées pour l'héritage d'implémentation, tandis que les types sont utilisés pour la substitution d'exécution.

Ici est un lien expliquant le principe de substitution et pourquoi les sous-classes et sous-types ne sont pas toujours la même chose (dans Java par exemple.) La page wikipedia sur la covariance et la contravariance contient plus d'informations sur cette distinction.

1
Doug Currie

Si nous réfléchissons à cette question dans le contexte C #, nous arrivons à une 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 structures
  • Types nullables

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 l'objet 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 des objets de type. Les valeurs des types de valeur sont traitées comme des objets en effectuant des opérations de boxing et unboxing.

donc comme je le vois, le type est un parapluie sur de nombreux éléments dont la classe est l'un d'entre eux.

Referece: doc de spécification de langue CSahrp, page 4

0
Amirreza

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 (= différentes 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 Principe de substitution Liskov, par exemple cet exemple LSP ).

0
jk_

Dans agnostique général du langage sens - La classe est une réalisation du Tapez .

Souvent, lorsque c'est la réalisation seulement de ce type, vous pouvez utiliser les deux termes pour le référencer dans un certain contexte.

Au contraire, par exemple, dans le contexte C # - La classe est juste un du beaucoup plus implémentations d'un type concept comme les primitives, les structures, les pointeurs, etc.

0
Sevenate

C'était une bonne question pour moi, ce qui m'a fait réfléchir. J'oserais dire que Class est un truc de temps de compilation et Type est un truc de runtime. Je dis cela parce que vous écrivez des classes et non des types. Le compilateur crée ensuite des types à partir des classes et le runtime utilise des types pour créer des instances d'objets.

0
ThinkAgain

Question interessante. Je pense que la réponse d'Aku est parfaite. Prenons l'exemple de la classe Java ArrayList

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

Une instance de la classe ArrayList serait du type de chaque superclasse qu'elle étend et de chaque interface qu'elle implémente. Par conséquent, une instance de la classe ArrayList a un type ArrayList, RandomAccess, Cloneable, etc. En d'autres termes, les valeurs (ou instances) appartiennent à un ou plusieurs types, les classes définissent ce que sont ces types.

0
armandino

De toute évidence, comme il existe des langages avec un système de types qui ne sont pas OO langages de programmation, type doit être un concept plus large que class

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 pas chaque type est une classe.

0
Ingo

Les types en C, comme Int Float, char etc. définissent des données qui peuvent être utilisées 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, je fais les opérations que je peux faire avec ce nouveau type de données. Dans le cas de l'entier que je devais ajouter, soustraire, etc. Avec ce nouveau type de données, je peux définir toutes les opérations qui me semblent sensées. Ils peuvent être ajouter, soustraire, etc., mais ils peuvent ajouter d'autres choses. Ce sont toutes 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 juste la flexibilité de définir de nouveaux types et tout sur leur fonctionnement.

Une fois que cela est défini, chaque fois que j'instancie un objet de classe "thingy", il a la structure de données que j'ai définie et les opérations (méthodes) que j'ai dites que vous pouvez faire avec. La classe "thingy" n'est clairement ni plus ni moins qu'un nouveau type que C++ me permet de définir.

0
Aaron Bauch