Anonymous inner classes en C#

Je suis dans le processus de rédaction d'un C# Guichet de la mise en œuvre dans le but d'approfondir ma connaissance de C# et de Guichet. Un des problèmes que nous sommes en cours d'exécution en est que le Guichet fait un usage intensif de anonyme intérieur des classes, et le C# n'a pas les classes internes anonymes.

Ainsi, par exemple, dans le Portillon, vous définissez un Lien comme ceci:

Link link = new Link("id") {
    @Override
    void onClick() {
        setResponsePage(...);
    }
};

Depuis Lien est une classe abstraite, il oblige le réalisateur à mettre en œuvre une méthode onClick.

Toutefois, en C#, car il n'y a pas anonyme intérieur des classes, il n'y a aucun moyen de le faire. Comme alternative, vous pouvez utiliser les événements comme ceci:

var link = new Link("id");
link.Click += (sender, eventArgs) => setResponsePage(...);

Bien sûr, il ya quelques inconvénients à cela. Tout d'abord, il peut y avoir plusieurs gestionnaires de Clic, ce qui pourrait ne pas être cool. Il ne force pas le réalisateur d'ajouter un gestionnaire d'événements Click.

Une autre option pourrait être d'avoir une fermeture de la propriété comme ceci:

var link = new Link("id");
link.Click = () => setResponsePage(...);

Cela résout le problème d'avoir plusieurs gestionnaires, mais ne peut toujours pas la force de l'implémenteur pour ajouter le gestionnaire.

Donc, ma question est, comment voulez-vous émulez quelque chose comme cela dans idiomatiques C#?

  • Je ne vois pas un anonyme intérieur de la classe, dans l'exemple que vous avez donné. Si vous souhaitez la mise en œuvre de votre classe abstraite pour toujours mettre en œuvre des méthodes que vous pouvez créer une méthode abstraite dans la classe ou de l'avoir à implémenter une interface.
  • il y a une ligne anonyme de classe qui hérite de Link et remplace la onClick méthode. Contrairement à Java, C# ne prend pas en charge anonyme classes de dériver à partir d'un type d'utilisateur.
  • Dimitrov, merci pour cette remarque. Je cherchais un vrai "intérieure/imbriquée" de la classe. L'exemple fourni ressemble plus à une classe anonyme qui dérive d'une classe existante, au moins en C# lingo.
  • Vieux sujet mais bon, c'est toujours là... c'est un intérieur de classe parce qu'en Java, chaque classe est soit un haut-niveau de la classe ou d'une classe imbriquée (définie à l'intérieur d'une autre classe), et qu'elle soit statique ou non statique de la classe. C'est un non-statique de la classe imbriquée, et le terme qui est intérieur de la classe.
InformationsquelleAutor cdmckay | 2011-01-22