« U-turn » sur l'importance du mécanisme de polymorphisme et sa mise en œuvre

Reproduit de: https://hesey.wang/2010/12/significance-and-implementation-of-polymorphism.html, merci pour le partage

Qu'est-ce qu'un mécanisme multi-états?

Est la variable de référence définie classe parente ou d'une interface peut pointer vers une sous - classe ou instance d'une classe d'implémentation de l' objet et la méthode des appels de procédure que la liaison dynamique lors de l' exécution, les méthodes spécifiques pour atteindre les points de variables d'objet est une référence, qui est, la mémoire est le procédé de fonctionnement de cet objet, plutôt que d' un procédé de variable de type de référence définie.

Le sens et le mécanisme multi-états

Dans la programmation orientée objet (programmation orientée objet, POO), le mécanisme multi-état est sans aucun doute la caractéristique la plus unique peut même dire, ne pas utiliser la programmation multi-état ne peut pas être appelé POO. Voilà pourquoi certaines personnes disent, l'utilisation de la programmation orientée objet et le langage de programmation orienté objet sont deux choses différentes.

Polymorphisme n'a pas de définition stricte, la définition sur Wikipedia à sous la plus détendue:

polymorphisme Sous-type, presque universellement appelé polymorphisme seulement dans le contexte de la programmation orientée objet, est la capacité d'un type, A, apparaître comme et être utilisé comme un autre type, B.

Un sous-type et sous-type

Ici , je voudrais mentionner le sous-type (Sous - type) mot et sous - classe (sous - classe) différence, simplement, aussi longtemps que la classe A étend l' utilisation de mots - clés pour obtenir l'héritage de la classe B, alors nous pouvons dire la classe A classe B est une sous - classe des sous - classes est le mot à un niveau grammatical, tant que la syntaxe de l' héritage, il existe une relation de sous - classe.

Sous-types ont des exigences plus strictes que la sous-classe, qui exige non seulement l'héritage de la syntaxe et de demander s'il y a une sous-classe de réécriture de la méthode de la classe mère (override), puis réécrire le contenu doit être conforme à la classe parente sémantique d'origine, il est appelé après le même effet et l'action devrait être mis en œuvre dans le sens de la classe parente.

La comparaison des deux est à souligner un point: seulement assurer la sous - classe est un sous - type polymorphisme est logique.

En second lieu, le mécanisme polymorphes

Polymorphisme essentiellement de deux façons:

  • polymorphisme compilation (également connu sous le nom polymorphisme statique)

  • polymorphisme Runtime (également connu sous le polymorphisme dynamique)

Surcharge (surcharge) polymorphisme de compilation est un exemple de polymorphisme de compilation a été déterminée au moment de la compilation, la méthode d' exécution de l' exécution de la détermination de l'appel.

Nous faisons habituellement référence à polymorphes se réfère polymorphisme est en cours d' exécution, qui est, qui ne sait pas si les appels de méthode spécifique au moment de la compilation , a été retardée afin de déterminer quand exécuter. C'est pourquoi parfois méthode polymorphique est également connu comme dilatoire raison.

Comportement sur le polymorphisme Wikipédia est décrit comme:

L'utilisation principale du polymorphisme dans l'industrie (théorie de la programmation orientée objet) est la capacité des objets appartenant à différents types de répondre à la méthode, sur le terrain ou les appels de propriété du même nom, chacun selon un comportement spécifique de type approprié.

Le polymorphisme des mécanismes de brèves suivants (ci-après dénommé le polymorphisme) de l'exécution.

Polymorphes généralement deux méthodes:

  • hérite sous-classe de la classe parent (allonge)

  • Classe implémente l'interface (les outils)

Quoi qu'il en soit, le noyau de l'endroit est de réécrire ou de réaliser la méthode de la classe parent à des procédés d'interface pour obtenir différents effets sur l' exécution run-time. Pour polymorphisme utilisation, lors de la déclaration de l'objet devrait suivre une règle: toujours le type de classe parente ou d'une déclaration de type d'interface, pour créer le type réel. Par exemple, supposons que nous voulons créer un objet ArrayList, la déclaration doit être utilisée comme cette déclaration:

List<> list =new ArrayList<>();
//而不是
ArrayList<> list =new ArrayList<>();

//先使用父类类型或接口类型,例如某方法应该写成:
public void doSomething(List list);
//而不是
public void doSomething(ArrayList list);

Le plus grand avantage de cette déclaration est que la flexibilité de la structure : Si un jour , je pense que les caractéristiques du ArrayList ne peuvent pas répondre à mes besoins, je veux être en mesure de le remplacer par un LinkedList, il vous suffit de mettre les nouvelles ArrayList () a changé à de nouveaux objets créés en place LinkedList peut, tout autre code non et ne changera pas.

Le programmeur (et le programme) n'a pas à connaître le type exact de l'objet à l'avance, et donc le comportement exact est déterminé lors de l'exécution (ce qui est appelé la liaison tardive ou liaison dynamique).

possibilité virtuelle d'appeler approche dynamique dans la mise en œuvre du programme de la classe réelle, il passera appelé la liaison dynamique (appelée aussi la liaison tardive) de mécanisme de mise en œuvre automatique de ce processus est transparent pour le programmeur.

Troisièmement, l'utilisation de polymorphes

Polymorphes plus grand usage que je pense que pour la réutilisation de la conception et l' architecture , et de plus, le « mode de conception » a préconisé une interface pour la programmation au lieu des exemples typiques pour la réalisation de la programmation est l'utilisation complète du polymorphisme. Lorsque les définitions et les composants de la fonction de définition d'interface, peuvent être laissées après le flux de mise en œuvre en. Une interface peut avoir en même temps plusieurs implémentations, et même peut utiliser une variété d'outils de l'interface ( par exemple ArrayList et les décisions sur les différentes caractéristiques pour obtenir exactement ce que les utilisations LinkedList) alors que dans une conception.

Atteindre quatre, polymorphisme

Ici, dans la perspective de la machine virtuelle brièvement décrit l'exécution de la mise en œuvre du principe de multi-état, où la machine virtuelle Java (Java Virtual Machine, JVM) spécification de mise en œuvre à titre d'exemple.

Dans l'exécution JVM du bytecode Java, des informations de type est stocké dans la zone de traitement , appelé généralement un procédé pour optimiser la vitesse de l'objet, le type d'information d' un procédé d'augmentation de la zone du pointeur, le pointeur pointe vers une entrée de table enregistre ces méthodes ( appelé table de méthodes ), la table est un pointeur vers chacun de la méthode correspondante.

table Constructor est la suivante:

Depuis l' héritage unique de Java, une classe ne peut hériter d'une classe parent, mais toutes les classes qu'ils héritent de la classe d'objets. Méthode tableau première méthode est stockée dans la classe d'objet, suivie de la classe parent de la classe, est la dernière classe de la méthode elle - même. La clé ici est ce lieu, si une sous - classe récrire la classe parente, puis ceux de la même sous - classe de nom et la méthode superclasse de partager une entrée de table, il a été reconnu comme la classe parente.

Notez que seulement les méthodes d'instance non-privé apparaîtront , et la méthode statique ne semble pas ici, la raison est facile à comprendre: la méthode statique n'a rien à voir avec l'objet, la méthode peut se référer directement à l'adresse, au lieu d'une méthode d'instance nécessite référence indirecte.

Plus en profondeur parler, méthode statique est appelée instructions de machine virtuelle méthodes invokestatic, privées et les constructeurs sont appelés par l'instruction invokespecial, seule la méthode est appelée instructions invokevirtual et invokeinterface apparaissent dans le tableau de la méthode.

Etant donné que les caractéristiques d'alignement du processus ci - dessus (parent de l' objet - - sous - classe), de sorte que la méthode de la table de décalage est toujours fixe. Par exemple, pour une classe, la méthode de table d' offset méthode qui est toujours égale à une valeur constante, toutes les sous - classes héritent d' une table de la méthode de la classe parente, le procédé offset est également définie dans la classe parente totale est une valeur fixe.

Comme mentionné ci-dessus, dans l'entrée de table de procédé est un pointeur sur la classe du procédé correspondant, où un état multi-start:

  • Supposons Classe A Classe B est une sous-classe de A et le procédé B, un procédé de réécriture (), la méthode du tableau B, le pointeur pointant méthode est la méthode d'entrée de la méthode selon la méthode B.

  • Et A est, méthode une méthode de sa table de méthode pointer vers sa propre méthode plutôt que la méthode de son parent (qui est déjà garanti chargeur de classe lorsque la charge de classe, alors que la machine virtuelle Java toujours garantie de point de référence de l'objet aux informations de type correct).

La liaison pointeur de la méthode de décalage est fixe et le pointeur pointe toujours vers la méthode de classe de domaine réel , nous pouvons facilement trouver mécanisme de polymorphisme ici:

  • appel Méthode, en effet, il faut d'abord exemple complet d'une méthode de références de symboles sont résolus, le résultat est que le symbole de référence est interprété comme une méthode de table offset.

  • Le procédé de la zone de référence de la machine virtuelle obtenue par l'information de type d'entrée de l'objet, la table méthode de classe recherche.

  • Lorsque la déclaration de type classe parente objet sous-classe, appelée formellement la méthode de la classe parent, cette fois-ci de la classe de table de méthode virtuelle réelle opportunité (même si la déclaration est la classe parente, mais en fait ce type d'informations sont stockées dans informations de sous-classe) au nom de la méthode pour trouver le pointeur correspondant (utilisé ici, « Find » est en fait impropre, mentionné plus haut, est un procédé offset fixe, on peut obtenir décalage seulement selon pointeur), et en outre peuvent être dirigés vers une méthode dans la classe réelle.

Notre histoire n'est pas, en fait, la procédure ci - dessus est seulement pour polymorphes mécanisme d'héritage d' un usage interne, une autre façon de réaliser le polymorphisme: mettre en œuvre le contraste de l' interface est encore plus compliquée parce que, l' héritage unique de Java garantie une relation linéaire entre les classes, et peut atteindre simultanément une pluralité d'interfaces, de sorte que même avec difficile d'obtenir avec précision le procédé de pointeur de décalage. Par conséquent, dans la machine virtuelle Java, par exemple polymorphes d'un appel de méthode en fait deux instructions:

  • invokevirtual instruction pour appeler une méthode déclarée classe;

  • invokeinterface Instructions pour invoquer les méthodes déclarées interface.

Quand l' instruction de invokeinterface d'appeler une méthode, vous ne pouvez pas utiliser un recours décalage fixe mais honnêtement un par un pour trouver (bien sûr, la mise en œuvre effective est pas nécessairement le cas, la spécification JVM ne précise pas exactement comment atteindre ce regard, une machine virtuelle Java différente la mise en œuvre peut avoir différents algorithmes d'optimisation pour améliorer l' efficacité de la recherche). On peut voir, en termes de performance, appelant les méthodes de référence d'interface presque toujours plus lente que la méthode des références de classe d'appel. Il nous dit aussi, entre les classes et les interfaces interface comme la conception préférée n'est pas toujours raison, bien sûr, le problème de conception ne relève pas du champ d' application de cet article à explorer, mais l' analyse apparemment spécifique des questions spécifiques est toujours considéré comme un meilleur choix.

Je suppose que tu aimes

Origine www.cnblogs.com/antonzhao/p/12446904.html
conseillé
Classement