Descrizione del problema: Desidero poter passare un elenco di metodi ad altre classi in cui i metodi sono stati definiti in una sola classe. Se i metodi, alcuni dei quali hanno parametri di input e tipi di ritorno non vuoto, sono definiti in una classe, voglio essere in grado di passare una lista di alcuni di essi, con possibili duplicati, come parametro per il costruttore di un'altra classe.Array of methods: Adapter Pattern?
Codice Descrizione: Il codice che segue è un esempio di greggio e può essere ignorato se si toglie l'obiettivo principale. Un altro esempio, oltre a quello sotto, sarebbe un caso in cui i metodi sono int Aggiungi (int n1, int n2), int Sottrai (int n1, int n2), Moltiplica, ecc. E l'interfaccia ha un metodo chiamato int MathOperation (int n1, int n2).
tentativo di risolvere il problema: Il modello adattatore sembra avere la funzionalità che sto cercando, ma ho visto solo esempi in cui i metodi nell'interfaccia non hanno parametri di ingresso o di uscita. Un'implementazione di esempio che ho scritto solo per questa domanda è pubblicata di seguito.
Analogia problema: Si dispone di un servizio Web generatore di immagini casuali. Ci sono 30 mutazioni che possono essere applicate a un'immagine. Il client si connette e fa clic su un pulsante "Genera" e un elenco casuale di alcune di queste funzioni viene passato a un'altra classe all'interno del servizio Web che procede quindi a eseguire tali funzioni con i propri dati raccogliendo e eventualmente riutilizzando il rendimento valori per generare un'immagine cat modificata. Non può semplicemente chiamare i metodi nell'altra classe in modo esplicito perché questo processo deve essere eseguito in modo casuale in fase di esecuzione. Questo è il motivo per cui mi propongo di generare un elenco casuale di metodi che vengono eseguiti in ordine quando si fa clic sul pulsante "genera".
Spero di essere stato chiaro.
public class SomeClass {
...
public double UseWrench(double torque, boolean clockwise) { ... }
public double UsePliers(double torque, boolean clockwise) { ... }
public double UseScrewDriver(double torque, boolean clockwise) { ... }
public boolean UseWireCutters(double torque) { ... }
interface IToolActions {
double TurnFastener(double torque, boolean clockwise);
boolean CutWire(double torque);
}
private IToolActions[] toolActions = new IToolActions[] {
new IToolActions() { public double TurnFastener(double torque, boolean clockwise) { double UseWrench(double torque, boolean clockwise); } },
new IToolActions() { public double TurnFastener(double torque, boolean clockwise) { double UsePliers(double torque, boolean clockwise); } },
new IToolActions() { public double TurnFastener(double torque, boolean clockwise) { double UseScrewDriver(double torque, boolean clockwise); } },
new IToolActions() { public boolean CutWire(double torque) { boolean UseWireCutters(double torque); } },
};
}
public class Worker<T> {
public List<? extends IToolActions> toolActions;
public Worker(List<? extends IToolActions> initialToolSet){
toolActions = initialToolActions;
}
}
Penso di vedere cosa state cercando, ma avrò bisogno di una descrizione del problema migliore o di un esempio migliore. Il hold-up sembra essere il parametro del metodo e il valore restituito. Dovrai definire un modo per gestirli, e le tue esigenze particolari imporranno il modo in cui deve funzionare. Non esiste una "X" generica, risolve sempre questo tipo di problema. Forse spiegare quale problema stai selezionando i parametri stessi, che potrebbe essere un inizio. – markspace
Che ne dici di usare 'Lista'? –
Se lo desideri veloce e dinamico, puoi usare Reflection e solo elencare tutti i metodi nella classe, ottenere i loro parametri e riempirli in un ciclo. Ma questo non sarà così pulito come la bella interfaccia risponde sotto – Falco