Dans la programmation orientée objet, il est souvent souhaitable de faire référence au type de l'instance actuelle dans les méthodes ou les fonctions. Cependant, en Java, les variables de type ne sont pas autorisées à faire référence au type de la classe dans laquelle elles sont déclarées, ce qui conduit à des situations dans lesquelles le comportement souhaité ne peut pas être atteint.
Contourner les limitations des variables de type
Pour surmonter cette limitation, un modèle complexe a émergé appelé « Modèle de modèle curieusement récurrent » (CRTP). Ce modèle implique la création d'une structure de classe hiérarchique dans laquelle chaque niveau de la hiérarchie définit un contrat pour renvoyer le type d'exécution de ses instances :
Classe de base auto-typée
abstract class SelfTyped<SELF extends SelfTyped<SELF>> { abstract SELF self(); }
Cours d'extension intermédiaires (Résumé)
public abstract class MyBaseClass<SELF extends MyBaseClass<SELF>> extends SelfTyped<SELF> { MyBaseClass() { } public SELF baseMethod() { //logic return self(); } }
Classes d'implémentation de feuilles (finales)
public final class MyLeafClass extends MyBaseClass<MyLeafClass> { @Override MyLeafClass self() { return this; } public MyLeafClass leafMethod() { //logic return self(); //could also just return this } }
Utilisation du modèle
MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod(); AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
Précautions et Limitations
Le modèle CRTP n'est pas sans pièges et limites :
Conclusion
Le modèle CRTP offre une solution de contournement pour référencer le type actuel à l'aide de variables de type, mais il est important d'examiner attentivement ses implications et son utilisation. cela avec parcimonie. Il s'agit d'un modèle complexe qui nécessite une mise en œuvre minutieuse et doit être réservé aux cas où ses avantages l'emportent sur la complexité supplémentaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!