Avec les méthodes statiques, aucun objet ne permet de contrôler correctement le mécanisme de priorité.
Le mécanisme de méthode virtuelle de classe / instance normale permet un contrôle finement réglé des remplacements comme suit: chaque objet réel est une instance d'exactement une classe. Cette classe détermine le comportement des remplacements; il obtient toujours la première fissure aux méthodes virtuelles. Il peut alors choisir d'appeler la méthode parent au bon moment pour son implémentation. Chaque méthode parent obtient alors également son tour pour invoquer sa méthode parent. Il en résulte une belle cascade d'invocations parentales, qui accomplit l'une des notions de réutilisation de code pour lesquelles l'orientation d'objet est connue. (Ici, le code des classes de base / super est réutilisé d'une manière relativement complexe; une autre notion orthogonale de réutilisation de code dans OOP est simplement d'avoir plusieurs objets de la même classe.)
Les classes de base peuvent être réutilisées par diverses sous-classes, et chacune peut coexister confortablement. Chaque classe qui est utilisée pour instancier des objets dictant son propre comportement, coexistant pacifiquement et simultanément avec les autres. Le client a le contrôle sur les comportements qu'il souhaite et quand il choisit la classe à utiliser pour instancier un objet et le transmettre aux autres comme il le souhaite.
(Ce n'est pas un mécanisme parfait, car on peut toujours identifier les capacités qui ne sont pas prises en charge, bien sûr, c'est pourquoi des modèles comme la méthode d'usine et l'injection de dépendance sont superposés.)
Donc, si nous devions créer une capacité de substitution pour la statique sans rien changer d'autre, nous aurions du mal à ordonner les substitutions. Il serait difficile de définir un contexte limité pour l'applicabilité du remplacement, vous obtiendrez donc le remplacement globalement plutôt que localement comme avec les objets. Il n'y a aucun objet d'instance pour changer le comportement. Donc, si quelqu'un a invoqué la méthode statique qui a été remplacée par une autre classe, le remplacement doit-il prendre le contrôle ou non? S'il existe plusieurs remplacements de ce type, qui obtient le contrôle en premier? seconde? Avec les remplacements d'objet d'instance, ces questions ont toutes des réponses significatives et bien motivées, mais pas avec la statique.
Les remplacements pour la statique seraient considérablement chaotiques, et des choses comme cela ont déjà été faites.
Par exemple, Mac OS System 7 et versions antérieures utilisaient un mécanisme de correction de déroutement pour étendre le système en obtenant le contrôle des appels système effectués par l'application avant le système d'exploitation. Vous pouvez penser à la table de correctifs des appels système comme un tableau de pointeurs de fonction, un peu comme une table d'objets par exemple, sauf qu'il s'agissait d'une seule table globale.
Cela a causé un chagrin indescriptible aux programmeurs en raison de la nature non ordonnée de la correction des pièges. Quiconque a réussi à réparer le dernier piège a essentiellement gagné, même s'il ne le voulait pas. Chaque patcher du piège capturait la valeur de piège précédente pour une sorte de capacité d'appel parent, qui était extrêmement fragile. Suppression d'un correctif de déroutement, par exemple, lorsque vous n'avez plus besoin de connaître un appel système a été considéré comme une mauvaise forme car vous ne disposiez pas vraiment des informations nécessaires pour supprimer votre correctif (si vous le faisiez, vous décompacteriez également tout autre correctif qui aurait suivi. vous).
Cela ne veut pas dire qu'il serait impossible de créer un mécanisme pour les remplacements de statique, mais ce que je préférerais probablement faire à la place est de transformer les champs statiques et les méthodes statiques en champs d'instances et en méthodes d'instance de métaclasses, de sorte que l'objet normal des techniques d'orientation s'appliqueraient alors. Notez qu'il existe des systèmes qui le font également: CSE 341: classes et métaclasses Smalltalk ; Voir aussi: Quel est l'équivalent Smalltalk de la statique de Java?
J'essaie de dire que vous devrez faire une conception sérieuse des fonctionnalités du langage pour que cela fonctionne même raisonnablement bien. Par exemple, une approche naïve a été adoptée, a fait long feu, mais était très problématique, et sans doute (c'est-à-dire, je dirais) défectueuse sur le plan architectural en fournissant une abstraction incomplète et difficile à utiliser.
Au moment où vous avez terminé de concevoir la fonctionnalité de remplacement statique pour fonctionner correctement, vous venez peut-être d'inventer une forme de métaclasses, qui est une extension naturelle de la POO dans / pour les méthodes basées sur les classes. Il n'y a donc aucune raison de ne pas le faire - et certaines langues le font en fait. C'est peut-être un peu plus une exigence marginale qu'un certain nombre de langues choisissent de ne pas faire.
self
pointeur qui pointe vers la classe et non vers une instance de la classe.