2009-05-24 6 views
5

Je le schéma modèle suivant:Existe-t-il un moyen de surcharger les méthodes d'extension en C#?

public abstract class PARENTCLASS {...} 
public class CHILD_A_CLASS : PARENTCLASS{...} 
public static class EXTENSION{ 
    public static METHOD(this PARENTCLASS parent){...} 
    public static METHOD(this CHILD_A_CLASS child) {...} 
} 

Quelque chose comme ci-dessus, bien sûr, il y aura plus d'enfants (et petits-enfants) des classes, mais je viens juste l'un d'eux. Le problème est, quand j'ai appelé la méthode d'extension comme suit:

PARENTCLASS cc = new CHILD_A_CLASS(); 
cc.METHOD(); 

Il exécutera la PARENT Méthode d'extension au lieu de ma prévu méthode d'extension des enfants. Quelqu'un a une idée sur la façon de mettre en œuvre cela? (Je ne considère pas mettre la méthode elle-même dans la classe et la laisser faire l'héritage parce que je veux garder la classe de modèle propre et loin de l'autre logique).

Répondre

5

Il est certainement possible de surcharger méthodes d'extension. Votre code est un exemple de la façon exacte de le faire. Cependant, ce que vous semblez vouloir, c'est de surcharger les méthodes d'extension de telle sorte que le type d'exécution de l'objet déterminera l'appel de la méthode d'extension. Tout comme la définition d'une méthode virtuelle sur une classe. Il n'y a pas de support de syntaxe de langage spécifique pour une telle fonctionnalité.

Si cela est vraiment important pour vous, il est possible de mettre en œuvre la fonctionnalité manuellement. Cela demande un peu de force brute, mais le travail sera fait. Par exemple ...

public static class Extension { 
    public static void Method(this ParentClass p) { 
    var c = p as ChildAClass; 
    if (c != null) { 
     Method(c); 
    } else { 
     // Do parentclass action 
    } 
    } 
    public static void Method(this ChildAClass c) { 
    ... 
    } 
} 
+0

Merci. Je pense que le moulage de type serait trop coûteux pour l'exécution et aussi assez maladroit pour maintenir le code comme ceci. Je pense que je chercherais une méthode alternative pour l'implémenter. – xandy

+1

le moulage de type est assez rapide, bien qu'il puisse effectivement être désordonné à maintenir. –

+0

Votre proposition n'est pas polymorphe, la méthode sélectionnée n'est correcte que pour le type de référence de la compilation et non pour le type d'exécution. Pour le dire brièvement, ce n'est pas une priorité absolue - je crois que c'est une mauvaise pratique parce que cela ne fonctionnera pas tout le temps et mènera tout simplement à des incohérences et à l'apparence erronée et causera plus de problèmes. Je pense que les méthodes d'extension sont fausses car elles cachent le fait que ces méthodes ne sont pas distribuées dynamiquement. –

1

Malheureusement, je ne pense pas que vous serez en mesure d'obtenir ce que vous voulez ici. Les méthodes d'extension sont statiques et les méthodes statiques ne peuvent pas être virtuelles.

Vous pourriez contourner cela avec quelque chose comme la solution de JaredPar.

Si votre objectif est de séparer votre modèle d'une implémentation, je vous suggère de regarder dans le Bridge Pattern (GOF). "Séparer une abstraction d'une implémentation" Cela peut aider à séparer vos préoccupations et à garder votre classe de modèle plus propre.

Questions connexes