Ho un gran numero di istanze di una classe. Quelle istanze possono sparare un evento. L'unica cosa importante per quell'evento è quale istanza l'ha licenziata.
Ho un'altra istanza di una classe (e forse in futuro più classi), che vuole iscriversi a quell'evento.
Ad esempio (in pseudo C #):
class Button
{
public event EventHandler<Button> PressedTheButtonEvent();
}
class EventConsumer
{
private int buttonsPressed;
private OnButtonPressed(Button buttonReference)
{
buttonReference.color = blue;
buttonsPressed++;
}
}
Affinché la classe EventConsumer
si iscriva all'evento, è necessario iscriversi al delegato EventHandler<Button>
di ogni istanza. Dato che ho un gran numero di pulsanti, non mi piace iterare su tutti i pulsanti esistenti e sospendere. Questo è soggetto a errori, specialmente se, per qualche motivo, viene creato un pulsante, dopo averlo iterato su di essi.
Ho trovato 2 soluzioni:
- Crea
PressedTheButtonEvent
static. - Crea un'altra classe, che ha un singolo evento. Invece di ogni pulsante che attiva il suo evento, chiama un metodo sulla nuova classe per farlo.
Non mi piace 2. perché la nuova classe è strettamente associata alla classe Button. Anche a me non piace molto 1., perché se per qualche ragione qualcuno dimentica di annullare l'iscrizione all'evento statico, quelle istanze non saranno raccolte.
Ci sono altre soluzioni?
Sto scrivendo C #, ma ho cercato di mantenere la domanda in un contesto più generale.