Sous-type

Dans le de l'informatique, un sous-type est un Datatype qui est généralement lié à un autre datatype (le supertype ) par une certaine notion de la substituabilité de , signifiant que les programmes informatiques écrits pour opérer des éléments du supertype peuvent également opérer des éléments du sous-type. Plus spécifiquement, la relation de supertype-sous-type est souvent prise pour être celle définie par le principe de substitution de Liskov de ; cependant, n'importe quel langage de programmation donné peut ne définir sa propre notion de subtyping, ou aucune.

Exemple

Un exemple pratique simple des sous-types est montré dans le diagramme, droite. Le " générique d'objet ; bird" ; (ou, supertype) provoque le " dérivé de trois objets (ou, sous-types) ; duck" ; , " ; cuckoo" ; et " ; ostrich" ;. Chacune de ces derniers varie le " de base ; bird" ; le concept de sa propre manière, mais hérite toujours beaucoup du " ; bird" ; caractéristiques. Un élément de données peut être déclaré en tant que des n'importe quels des quatre types. La notation du UML est employée dans ce diagramme, avec les flèches ouvrir-dirigées montrant la direction et le type du rapport entre le supertype et ses sous-types.

Dans la plupart des langues orientées objectivement classe-basées du , les sous-classes provoquent des sous-types : si le A est une sous-classe du B , alors un exemple du A de classe peut être employé dans n'importe quel contexte où un exemple de type le B est prévu ; ainsi nous disons que le A est un sous-type du B . Une conséquence de ceci est que n'importe quelle variable ou paramètre avoué en tant qu'ayant le type le B pourrait, au temps d'exécution, tenir une valeur du A de classe ; dans cette situation beaucoup de programmeurs orientés objectivement diraient que le B est le statique de la variable et le A est son type dynamique de . Les exceptions à cette règle incluent la transmission privée dans le C++ (qui ne crée pas des sous-types), et certaines opérations sur dérivé saisit le Eiffel , où des dispositifs hérités d'une classe basse peuvent être enlevés ou modifiés d'une manière qui viole la règle subtyping.

En tant qu'autre exemple, une langue pourrait permettre à des valeurs de nombre entier d'être employée partout où des valeurs à point mobile sont prévues, ou elle pourrait définir un type number contenant les nombres entiers et les reals. En premier lieu, le type de nombre entier serait un sous-type du type à point mobile ; dans la seconde, ces deux types pourraient être indépendants entre eux par subtyping mais tous les deux seraient des sous-types de number.

Les programmeurs peuvent tirer profit de subtyping pour écrire le code d'une façon plus abstraite qu'être possible sans elle. Considérer l'exemple suivant :

la fonction maximum (x comme nombre, y comme nombre) est si x < puis y y de retour autrement x de retour extrémité

Si le nombre entier et vrai sont les deux sous-types de number, alors des valeurs de l'un ou l'autre type peuvent être passées à cette fonction. Pour cette raison, subtyping est souvent considéré une forme du polymorphisme . L'exemple ci-dessus peut également être comparé au dispositif de calibre de de C++.

Dans le type la théorie , la relation de sous-type est souvent écrite le < ; : , de sorte que < du A ; : le B de signifie que le A est un sous-type du B . Subtyping dans le type théorie est caractérisé par le fait que n'importe quelle expression de type le A peut également être donnée le type le B si < du A ; : B de ; la règle de dactylographie formel qui codifie ceci est connue pendant que la règle du subsumption de .

Arrangements de Subtyping

Le type théoriciens font une distinction entre le subtyping nominal , dans lequel seulement les types avoués d'une certaine manière peuvent être des sous-types de l'un l'autre, et le subtyping structural , dans lequel la structure de deux types détermine si on est un sous-type de l'autre. Subtyping orienté objectivement classe-basé décrit ci-dessus est nominal ; une règle subtyping structurale pour un langage de type objet pourrait indiquer que si les objets du type le A peuvent manipuler tous les messages que les objets du type le B peuvent manipuler (c'est-à-dire, s'ils définissent toutes les mêmes méthodes , alors le A est un sous-type du B indépendamment de si l'un ou l'autre hérite de de l'autre. Les règles subtyping structurales saines pour des types autres que des types d'objet sont également bien connues.

Réalisations des langages de programmation avec la chute subtyping dans deux classes générales : réalisations incluses du , dans lesquelles la représentation de n'importe quelle valeur de type le A représente également la même valeur au type le B si < du A ; : réalisations coercitives du B , et du de , dans lesquelles une valeur de type le A peut être le automatiquement converti dans un de type le B . Subtyping induit par subclassing dans un langage de type objet est habituellement inclus ; les relations subtyping qui rapportent des nombres entiers et les nombres à point mobile, qui sont représentés différemment, sont habituellement coercitives.

Dans presque tout le type systèmes qui définissent une relation subtyping, c'est verbe réfléchi (< de A de signification ; : de A pour tout type A ) et transitif (signification qui si < du A ; : < du B et du B de ; : < du A du C de puis ; : C de ). Ceci lui fait un Preorder sur des types.

Voir également


Un type dérivé par est un type donné un nouveau type mais structurellement les mêmes que le type original. Il mai ou mai ne pas être un sous-type selon le type système.
Contravariance dans la covariance de et contravariance (de l'informatique)
Le problème de Cercle-ellipse de pour les périls des variable-types subtyping sur la même base que des valeur-types
le Classe-a basé de programmation pour un exemple d'un problème quand on confond subtyping avec le Subclassing .
Random links:Dell | Vinculum (ligament) | Afnix (langage de programmation) | Tilak Nagar (Delhi) | Pilotfish (compagnie) | Subtipo