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?