Extension d’une classe instanciée par une autre classe

Je travaille avec une API Java utilisée pour les “macros” qui automatisent un logiciel. L’API contient, entre autres, les classes Simulation (un état de sorting global) et FunctionManager . Il n’y a rien que je puisse faire pour modifier ces classes.

J’aimerais créer une classe BetterFunctionManager qui extends FunctionManager car ce dernier manque de fonctionnalités utiles. Mais je ne sais pas comment faire cela, car FunctionManager ne peut pas être instancié directement. Cela doit provenir de Simulation , comme ceci:

 Simulation simulation = getCurrentSimulation(); FunctionManager functionManager = simulation.getFunctionManager(); 

Notez que la Simulation ne peut pas être instanciée directement non plus; il doit être obtenu via getCurrentSimulation() (la simulation en cours est déterminée à l’exécution par l’interpréteur de macros).

Je ne peux pas baisser les arm Ce qui suit lève une exception ClassCastException:

 BetterFunctionManager betterFunctionManager = simulation.getFunctionManager(); 

Comment puis-je construire BetterFieldFunctionManager ?

Disclaimer: Je suis encore très naïf pour la conception. Juste une suggestion. utiliser un modèle de conception de délégation

 public class BetterFunctionManager{ private FunctionManager fm; public BetterFunctionManager(FunctionManager fm){ this.fm = fm; } existingMethods(){ fm.existingMethods(); } newMethods(){ // new implementation } } 

Désavantages:

besoin d’envelopper toutes les méthodes de FunctionManager

Avantage:

il n’est pas nécessaire de changer ailleurs. juste changer comme

 BetterFunctionManager betterFunctionManager = new BetterFunctionManager (simulation.getFunctionManager()); 

Ce que vous avez trouvé s’appelle The Expression Problem et je crains que votre option la plus raisonnable pour l’attaquer avec du Java pur est la proposition de StinePike d’utiliser la composition et la délégation.

Si vous êtes en mesure de choisir l’outil pour la tâche, je vous recommande de jeter un coup d’œil aux protocoles Clojure . Ils offrent une très bonne solution au problème d’expression (voir très bonne explication ici – Résoudre le problème d’expression avec Clojure ) et si je ne me trompe pas, si vous finissez par coder votre solution en clojure, vous pouvez la comstackr dans une classe java. dans votre application java

Vos options étant limitées en raison des structures de classe, pourquoi ne pas créer une classe FunctionManagerUtility au lieu de BetterFunctionManager. Dans la classe FunctionManagerUtility, vous pouvez append des méthodes pour append vos fonctionnalités utiles en prenant l’object FunctionManager comme entrée.