Question

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

(Au sens général du terme agnostique)

Était-ce utile?

La solution

La réponse suivante provient de Gof book ( modèles de conception )

  

La classe d'un objet définit comment le   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, un objet    type fait uniquement référence à son interface - un   ensemble de demandes 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 requiert un type avec opération > , son propre type étant l'une de ses interfaces. Toute classe satisfaisant l'exigence ci-dessus peut être utilisée pour générer une fonction max spécifique pour cette classe.

Autres conseils

Je pense toujours à un "type" en tant que terme générique pour "classes" et "primitives".

int foo; // Le type est int, la classe est inexistante.

MyClass foo; // Le type est MyClass, la classe est MyClass

Inspiré par Wikipedia ...

En théorie des types ,

  • Un type est une interface abstraite.
    Les types représentent généralement des noms, tels qu’une personne, un lieu, une chose ou quelque chose de nominalisé,

  • Une classe représente une implémentation du type.
    C’est une structure de données et une collection de sous-programmes concrets

    Différentes classes concrètes peuvent produire des objets du même type abstrait (selon le système de type).

    * Par exemple, on pourrait implémenter le type de type Stack avec deux classes : SmallStack (fast for small) piles, mais les échelles sont faibles) et ScalableStack (l’échelle est bonne mais les frais généraux sont élevés pour les petites piles). * *

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

  

entrer la description de l'image ici

     

L'exemple de la banane.

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

  •   Les
  • classes ABCBanana et XYZBanana représenteraient des moyens de produire des bananes.
      (Différents fournisseurs de bananes dans la vie réelle, ou différentes structures et fonctions de données 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 de la classe ABCBanana , il s'agirait des objets de < em> tapez 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 peut ê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'objet disponibles. Une classe est l'un de ces modèles d'objet. Il en va de même du type de structure, du type Integer, du type Interface, etc. Ce sont tous des types

Si vous le souhaitez, vous pouvez le voir de la manière suivante: Un type est le concept parent. Tous les autres concepts: Classe, Interface, Structure, Integer, etc. héritent de ce concept.i.e Ce sont des types

Type contient une description des données (propriétés, opérations, etc.),

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

La classe à proprement parler 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 être instanciée contrairement aux classes.

La classe est un type spécialisé utilisé pour encapsuler les propriétés et le comportement d'un objet.

Wikipedia 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 constater, un type est un "résumé". terme désignant non seulement les définitions de classes, mais également les structures et les types de données primitifs tels que float, int, bool.

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, ce qui peut être considéré comme un type de classe très spécial, purement abstrait. Ce sont aussi des types.

So "type" englobe les classes, les interfaces et, dans la plupart des langages, les primitives. Les plates-formes telles que le CLR point-net ont également des types de structure.

Mes pensées vont tout à fait dans le sens de la réponse de aku.

Je considère les classes comme un modèle pour la création d'objets, tandis que les types permettent de classer ces objets et de nous fournir une interface.

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

Cette réponse à la même question dans lamba semble ultime moi comme une explication parfaite.

Extrait de la citation ci-dessous du GoF:

  

La classe d'un objet définit comment le   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, les objets    type fait uniquement référence à son interface, la   ensemble de demandes auxquelles il peut   répondre.

Je souhaite fournir 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 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 les sous-classes aide probablement également à comprendre ce problème:

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

Pour ajouter un autre exemple de distinction: en C ++, vous avez des types de pointeur et de 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 certaines langues, les fonctions sont considérées comme des "objets de première classe". dans ce 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.

Je pense qu'un type correspond à 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.

Comme une classe définit ce que vous pouvez faire avec les objets de cette classe, une classe définit un type. Une classe est plus que cela, car elle fournit également une description de la manière dont les méthodes sont implémentées (ce que le type n’implique pas) et de la manière dont les champs de l’objet sont disposés.

Notez également qu'une valeur d'objet ne peut avoir qu'une seule classe, mais 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.

Type fait généralement référence à la classification des valeurs primitives - entiers, chaînes, tableaux, booléens, null, etc. En règle générale, vous ne pouvez créer aucun nouveau type.

Classe fait référence à l'ensemble de propriétés et de méthodes nommées 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 certaines langues, 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 des types et des classes de différentes manières, avec différents résultats bénéfiques.

Les types et les classes sont liés mais non identiques. Mon point de vue est 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 est un lien expliquant le principe de substitution et expliquant pourquoi les sous-classes et les sous-types ne sont pas toujours identiques (en Java par exemple). La page wikipedia sur la covariance et la contravariance contient plus d'informations sur cette distinction.

Question intéressante. Je pense que la réponse d'Aku est parfaite. Prenez la classe java ArrayList comme exemple

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

Une instance de la classe ArrayList est dite de type pour chaque superclasse qu'elle étend et chaque interface qu'elle implémente. Par conséquent, une instance de la classe ArrayList a le 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.

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

Le type est composé des éléments suivants:

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

La classe comprend les éléments suivants:

  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 un type, car elle ne décrit pas la sémantique (décrit uniquement la syntaxe)

  • La sous-classe n'est pas un sous-type, car la sous-classe peut changer la sémantique définie dans la super-classe, le sous-type ne peut pas changer la sémantique du supertype (voir Principe de substitution de Liskov, par exemple cet exemple de LSP ).

Évidemment, comme il existe des langages avec système de types qui ne sont pas des langages de programmation OO, type doit être un concept plus large que classe

.

Même dans des langages tels que 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 réfléchissons à cette question dans le contexte C #, nous arrivons à 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 structures
  • Types nullables

Types de référence:

  • Types de classe
  • Types d'interface
  • Types de tableaux
  • Types de délégué

Comme vous pouvez le constater, il existe de nombreux types en C #, dont Class n’est que l’un d’entre eux. Il y a juste une note importante: Le système de types de C # est unifié, de sorte qu'une valeur de tout type peut être traitée en tant qu'objet. Chaque type en C # dérive directement ou indirectement du type de classe d'objet, et 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 en les visualisant simplement 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 de unboxing.

donc, à mon avis, le type est un parapluie recouvrant de nombreux éléments dont la classe est l'une d'entre elles.

Référence: spécification de langage CSahrp, page 4

Au sens général du langage , Class est une réalisation du type .

Souvent, lorsqu'il s'agit de 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 # - Classe n'est qu'un un des beaucoup d'autres implémentations d'un concept Type tel que des primitives, structures, pointeurs, etc.

C'était une bonne question pour moi, ce qui m'a fait réfléchir. J'oserais dire que Class est une tâche complexe et que Type est une tâche d'exécution. Je dis cela parce que vous écrivez des classes pas des types. Le compilateur crée ensuite des types à partir de classes et les types d’exécution utilisent pour créer des instances d’objets.

Les types en C, tels que Int Float, char, etc., définissent des données sur lesquelles il est possible d’agir avec des méthodes spécifiques. 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 commence par définir à quoi ressemblent les données. Peut-être que c'est un peu simple. Peut-être que c'est deux mots comme un complexe avec une partie réelle et imaginaire. Ou peut-être est-ce complexe avec 309734325 octets représentant la composition atomique d’une particule étrange sur Jupiter. Je m'en fiche. Tout comme un entier, je compose les opérations que je peux effectuer avec ce nouveau type de données. Dans le cas du nombre entier j’ai ajouté, soustrait, etc. Avec ce nouveau type de données, je peux définir toutes les opérations qui me semblent logiques. 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.

La ligne du bas 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 float, un caractère, etc. Mais cela implique également quelles opérations sont légales et produiront des résultats fiables.

Une classe n’est pas différente, sauf que c’est à vous 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, comme une définition de type définit le comportement d'un entier lorsque vous l'utilisez.

Les classes vous permettent simplement de définir de nouveaux types et tout leur fonctionnement.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top