C# extension de la méthode d'une interface de mise en œuvre
Je me demandais si un C# méthode d'extension d'une classe pourrait agir comme une implémentation de l'interface?
Que dois-je:
Un iterface:
public interface IEventHandler
{
void Notify(SEvent ev, IEventEmmiter source);
}
Une classe qui l'implémente:
class Sim : IEventHandler
{
/*public void Notify(SEvent ev, IEventEmmiter source)
{
Console.WriteLine("Got notified: " + ev.Name);
}*/
}
Et une classe qui contient la méthode d'extension:
public static class ReflectiveEventDispatcher
{
public static void Notify(this IEventHandler handler, SEvent ev)
{
if (handler.GetType().GetMethod("Handle" + ev.Name) != null)
{
//C# WTF?
object[] prms = new object[0];
prms[0] = ev;
handler.GetType().GetMethod("Handle" + ev.Name).Invoke(handler, prms);
}
else
{
throw new System.NotImplementedException("This object doesn't have appropriate handler methods for event " + ev.Name);
}
}
}
Maintenant, je veux avoir différentes classes avec IEventHandler interface et les interfaces de mise en œuvre doit être réalisée par la méthode d'extension.
Si ce n'est pas possible, est-il possible de définir le Notifier explicitement et puis juste avant l'appel à la méthode d'extension?
Le code ci-dessus est essentiellement un héritage multiple hack. Est-il possible d'émuler ce comportement par un (autre) cela signifie?
(J'espère que cela a un sens, je suis habitué à Ruby et ce qui me donne du fil à retordre. Oh, comment puis-je m'ennuie de vous, mes chers mixin...)
Mise à jour
Renvoi d'appel résolu assez bien:
public void Notify(SEvent ev)
{
ReflectiveEventDispatcher.Notify(this, ev,);
}
- Vous pouvez même le faire: ce.Notify(ev);
Vous devez vous connecter pour publier un commentaire.
cela ne peut pas être fait de la façon dont vous le décrire: C# appel de la méthode de résolution de toujours choisir la mise en œuvre concrète de votre méthode, jamais le une extension de la méthode.
Cependant, je crois que vous pouvez vous -un peu - obtenir ce que vous voulez si vous NE définissez PAS la méthode dans l'interface, mais simplement que les méthodes d'extension dans des espaces de noms différents. Bien sûr, c'est "statique", en ce que la méthode appelée sera toujours sélectionné au moment de la compilation.
Pratiquement parlant, ensuite, vous sélectionnez la méthode appelée par le droit "à l'aide de la" directive (de la même manière LINQ œuvres)
Pas, les méthodes d'Extension ne peuvent pas agir en tant que mise en œuvre d'une interface. Les Extensions de méthodes sont juste sucre syntaxique pour une méthode statique prenant une instance de cette classe en tant que premier paramètre, ce qui n'est pas membre de la classe spécifique, qui est une exigence pour la mise en œuvre d'une interface.
Ce n'est pas possible.
Méthodes d'Interface doit être implémentée par le type d'implémentation elle-même.
Les méthodes d'Extension sont purement langue niveau du concept (la syntaxe de sucre), et ne va pas aider. Le CLR est lui-même complètement ignorant des méthodes d'extension,