29 votes

Exemple de contravariance

Je pense à l'exemple suivant pour illustrer pourquoi la contravariance est utile.

Prenons l'exemple d'un GUI cadre avec Widgets, Events, et Event Listeners.

abstract class Event;
class KeyEvent extends Event
class MouseEvent extends Event

trait EventListener[-E] { def listen(e:E) }

Laissez - Widgets définir les méthodes suivantes:

def addKeyEventListener(listener:EventListener[KeyEvent])
def addMouseEventListener(listener:EventListener[MouseEvent])

Ces méthodes n'accepter qu' "spécifique" des écouteurs d'événement, ce qui est bien. Cependant, je voudrais définir aussi "cuisine-évier" les auditeurs, qui sont à l'écoute de tous les événements, et de transmettre les auditeurs à "ajouter un listener" méthodes ci-dessus.

Par exemple, je voudrais définir LogEventListener pour le journal de tous les événements entrants

class LogEventListener extends EventListener[Event] {
   def listen(e:Event) { log(event) }
}

Depuis le trait EventListener est contravariant en Event , nous pouvons passer l' LogEventListener de toutes les personnes "ajouter un listener" méthodes sans perdre leur type de sécurité.

Est-il judicieux ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X