C# connaît deux mandats, delegate
et event
. Commençons avec la première.
Délégué
Un delegate
est une référence à une méthode. Comme vous pouvez créer une référence à une instance:
MyClass instance = myFactory.GetInstance();
Vous pouvez utiliser un délégué pour créer une référence à une méthode:
Action myMethod = myFactory.GetInstance;
Maintenant que vous avez cette référence à une méthode, vous pouvez appeler la méthode par la référence:
MyClass instance = myMethod();
Mais pourquoi le feriez-vous? Vous pouvez aussi appeler myFactory.GetInstance()
directement. Dans ce cas, vous pouvez. Cependant, il existe de nombreux cas pour réfléchir à l'endroit où vous ne voulez pas le reste de l'application des connaissances de l' myFactory
ou à l'appel d' myFactory.GetInstance()
directement.
Évidente est que si vous voulez être en mesure de remplacer myFactory.GetInstance()
en myOfflineFakeFactory.GetInstance()
d'une place centrale (aka usine méthode de motif).
Méthode de fabrique de modèle
Donc, si vous avez un TheOtherClass
de la classe et qu'il doit utiliser l' myFactory.GetInstance()
, c'est la façon dont le code ressemblera sans délégués (vous aurez besoin de laissez - TheOtherClass
connaître le type de votre myFactory
):
TheOtherClass toc;
//...
toc.SetFactory(myFactory);
class TheOtherClass
{
public void SetFactory(MyFactory factory)
{
// set here
}
}
Si vous souhaitez utiliser les délégués, vous n'avez pas à exposer le type de mon usine:
TheOtherClass toc;
//...
Action factoryMethod = myFactory.GetInstance;
toc.SetFactoryMethod(factoryMethod);
class TheOtherClass
{
public void SetFactoryMethod(Action factoryMethod)
{
// set here
}
}
Ainsi, vous pouvez donner un délégué de classe à utiliser, sans exposer votre type. La seule chose que vous exposez est la signature de votre méthode (le nombre de paramètres que vous avez et tel).
"La Signature de ma méthode", où ai-je entendu cela avant? O oui, interfaces!!! les interfaces de décrire la signature de l'ensemble de la classe. Pensez délégués décrivant la signature d'une seule méthode!
Une autre grande différence entre une interface et d'un délégué, c'est que lorsque vous avez écrit votre classe, vous n'avez pas à dire à C# "cette méthode met en œuvre ce type de déléguer". Avec les interfaces que vous avez besoin de dire "cette classe met en œuvre ce type d'interface".
En outre, un délégué de référence (avec quelques restrictions, voir ci-dessous) référence à plusieurs méthodes (appelées MulticastDelegate
). Cela signifie que lorsque vous appelez le délégué, plusieurs explicitement-joint méthodes seront exécutées. Une référence de l'objet peut toujours seule référence à un objet.
Les restrictions pour un MulticastDelegate
sont de la méthode ou de son délégué) signature ne doit pas avoir une valeur de retour (void
) et les mots-clés out
et ref
ne sont pas utilisés dans la signature. Évidemment, vous ne pouvez pas appeler deux méthodes qui retournent un nombre, et attendre d'eux de revenir par le même nombre. Une fois que la signature est conforme, le délégué est automatiquement MulticastDelegate
.
L'événement
Les événements sont seulement des propriétés (comme le get;set; propriétés des champs d'instance) qui exposent abonnement à la déléguer à partir d'autres objets. Ces propriétés, mais ne pas appuyer " get;set;. Au lieu de cela ils soutiennent ajouter;supprimer;
De sorte que vous pouvez avoir:
Action myField;
public event Action MyProperty
{
add { myField += value; }
remove { myField -= value; }
}
L'utilisation de l'INTERFACE utilisateur (WinForms)
Donc, maintenant nous savons qu'un délégué est une référence à une méthode et que l'on peut avoir d'un événement à faire savoir au monde qu'ils peuvent nous donner leurs méthodes pour être référencé à partir de notre délégué, et nous sommes un bouton de l'INTERFACE utilisateur, puis: on peut demander à n'importe qui qui est intéressé à savoir si j'ai été cliqué, pour enregistrer leur méthode avec nous (par l'intermédiaire de l'événement, nous avons exposé). Il peut utiliser toutes les méthodes qui nous ont été donnés, et de les référencer par notre délégué. Et puis, nous allons attendre et attendre.... jusqu'à ce qu'un utilisateur vient et clique sur le bouton, puis nous allons avoir assez de raison d'invoquer le délégué. Et parce que le délégué références de toutes ces méthodes, toutes ces méthodes sera invoquée. Nous ne savons pas ce que ces méthodes font, ni nous savons que la classe implémente ceux de la méthode. Tous nous ne de soins, c'est que quelqu'un était intéressé à nous d'être cliqué, et nous a donné une référence à une méthode qui respecte nos souhaité signature.
Java
Des langues comme Java n'ont pas de délégués. Ils utilisent des interfaces à la place. La façon de faire c'est de demander à quelqu'un qui est intéressé par "nous, cliqué sur", pour mettre en œuvre un certain interface (avec une certaine méthode, nous pouvons l'appeler), puis nous donner la totalité de l'instance qui implémente l'interface. Nous pouvons que garder une liste de tous les objets implémentant cette interface, et de peuvent appeler leur "certaines méthode, nous pouvons appeler" dès qu'on a cliqué.