Downcasting automatico

3

Sto creando un framework in Java e ho un metodo nella mia classe astratta, BasicPhase, chiamato processAction (snippet di seguito). Prende due classi astratte come parametri poiché l'utente dovrebbe implementarle in classi figlio. Tuttavia, risulta che all'utente viene richiesto di essere costantemente downcast ogni volta che sostituisce il metodo. Come può essere evitato?

BasicPhase.java

public class BasicPhase {
    ...
    public BasicGameState processAction(BasicAction action, BasicGameState state);
    ...
}

Esempio di classe utente

MyPhase.java

public class MyPhase extends BasicPhase {
    @Override
    public BasicGameState processAction(BasicAction basicAction, BasicGameState basicState)  {
        MyGameState state = (MyGameState) basicState; //undesired
        MyAction action = (MyAction) basicAction; //undesired

        //Game Logic Here
    }
}
    
posta Jason Lin 01.01.2016 - 19:30
fonte

2 risposte

5

processAction chiaramente non può lavorare sui tipi di azione e stato base , quindi devi rendere i tipi che devono essere passati come parametri specificatamente i tipi che processAction può lavorare con. Per rendere i tipi di parametro definibili dalle tue classi derivate, devi rendere la classe base generica in modo tale che i parametri generici siano i tipi di azione e lo stato del gioco accettati dalla fase.

Fai questo creando BasicPhase a

public class BasicPhase<TAction extends BasicAction, TState extends BasicGameState>

e processAction a processAction(TAction action, TState state) quindi il tuo MyPhase deriverebbe come:

public class MyPhase extends BasicPhase<MyAction, MyGameState> {
    
risposta data 01.01.2016 - 21:41
fonte
4

Se MyPhase.progressAction chiamerebbe esclusivamente metodi disponibili in BasicAction o BasicGameState , quindi non ci sarebbe bisogno di alcun downcast. Questi metodi potrebbero essere metodi o metodi ordinari sovrascritti in MyAction e / o MyGameState . Pertanto, dovresti considerare di cambiare il design di BasicAction , BasicGameState e / o progressAction per rendere possibile ciò.

Nota, come ha affermato correttamente @ErikEidt nel suo commento, che questa potrebbe non essere la soluzione migliore o più sensata per il tuo caso, dal momento che non ci hai fornito informazioni sufficienti per consentire un consiglio migliore.

    
risposta data 01.01.2016 - 20:37
fonte

Leggi altre domande sui tag