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.
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?
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 typeStack 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 Bananatype 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 ABCBananaclasse , 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.
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
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:
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.
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.
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.
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.
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 AetIType et la classe Best de type BetIType 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:
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.
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.
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 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.
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 ).
É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.
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
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.
Réponses:
La réponse suivante est tirée du livre Gof ( Design Patterns )
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.
la source
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
la source
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) etScalableStack
(é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 .
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.
la source
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
la source
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:
la source
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.
la source
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.
la source
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.
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.
la source
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.
la source
Tiré de la citation du GoF ci-dessous:
Je veux donner un exemple utilisant Java:
Les deux classes
A
etB
implémentent l'interface et sont donc du typeIType
. De plus, en Java, les deux classes produisent leur propre type (respectivement à leur nom de classe). Ainsi la classeA
est de typeA
etIType
et la classeB
est de typeB
etIType
satisfaisante: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
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source
Question interessante. Je pense que la réponse d'aku est parfaite. Prenez la
ArrayList
classe java comme exempleOn 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 laArrayList
classe a un typeArrayList
,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.la source
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 ).
la source
É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.
la source
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
la source
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.
la source