Come rendere un'interfaccia e le sue implementazioni compatibili

1

In un'applicazione di gara che sto progettando ci sono diversi tipi di estrazione a premi, ognuno dei quali deve agire su un oggetto di entrata in qualche modo. Quindi le prime righe di codice che ho scritto definivano un'interfaccia.

interface PrizeDrawInterface
{
    public void enter(EntryInterface entry);
}

Ecco il problema che non so come risolvere. Risulta che le implementazioni richiederanno oggetti più specifici di EntryInterface .

class RandomPrizeDraw implements PrizeDrawInterface
{
    public void enter(WinnableInterface entry)
    {
        if (someRandomCondition) {
            entry.setWinner(true);
        }
    }
}

class QuizPrizeDraw implements PrizeDrawInterface
{
    public void enter(QuizContestantInterface contestant)
    {
        if (contestant.getAnswer().isCorrect()) {
            contestant.givePrize();
        }
    }
}

Ovviamente il codice sopra non funzionerà, poiché le firme del metodo enter() non sono compatibili.

La mia attuale soluzione migliore è quella di aggiungere un metodo in più alle estrazioni dei premi e delegare l'applicazione del tipo lì, in modo che possano assomigliare a questo:

class RandomPrizeDraw implements PrizeDrawInterface
{
    public void enter(EntryInterface entry)
    {
        this.doEnter(entry);
    }

    public void doEnter(WinnableInterface entry)
    {
        if (someRandomCondition) {
            entry.setWinner(true);
        }
    }
}

Ma per me sembra più una soluzione rapida che una soluzione pulita.

Questo problema ha un nome? La mia interfaccia non è adatta allo scopo? Esiste una soluzione più pulita di quella che ho proposto?

    
posta Sam Hastings 27.02.2018 - 22:43
fonte

1 risposta

3

Sulla base del codice che hai mostrato, la mia sensazione istintiva è che enter è un costruttore che sta mascherando come metodo.

Ad esempio, nel punto in cui vuoi richiamare RandomPrizeDraw.enter(WinnableInterface entry) , hai già stabilito che RandomPrizeDraw e WinnableInterface sono accoppiati. Quindi cercare di esprimere questo e altri (diversi) accoppiamenti tramite un'interfaccia non ha molto senso.

Quindi penso che sarebbe meglio usare una sorta di factory che restituisce un'implementazione di PrizeDrawInterface in base al tipo di implementazione di EntryInterface e eliminare completamente enter .

    
risposta data 27.02.2018 - 23:35
fonte

Leggi altre domande sui tag