9
votes

Montrer un avertissement lorsque l'une des paires de méthodes ou de propriétés est remplacée

J'ai un C # -Class qui fournit des opérations virtuelles. Pour chaque opération, il existe une version synchrone et asynchrone.

public class Foo{
   public virtual void Bar(){..};
   public virtual Task BarAsync(){..};

   ...
}


3 commentaires

Vous devriez écrire un ROSLYN Analyzer .


Comme il a répondu à Himbrombeere, il semble plus logique alors de faire une classe de base abstraite et de mettre le code que vous avez réellement remplacé dans votre cas ici dans une implémentation existante.


La classe fait partie d'un peu de cadre et l'architecture proposée complique son utilisation car la consommation de FOO n'est pas faite de la même manière que celle de FOO.


3 Réponses :


3
votes

Bien que ce ne soit pas une réponse à votre question actuelle, je demandais une approche où vous n'avez même pas besoin de l'avertissement.

Pourquoi ne pas créer une classe abstraite avec des membres ultérieurs et une scellée sans: xxx

maintenant client peut concevoir s'il a besoin d'une implémentation de foo avec votre comportement par défaut (= donotimplementit ) ou s'il a besoin d'un personnalisable Version à l'aide de Mise en œuvre . Dans le premier cas, il est obligé de remplacer les membres dans ce dernier cas non.

Cette approche est beaucoup plus propre à votre utilisateur-API car il sait quoi remplacer la chaîne d'héritage au lieu de s'appuyer sur des avertissements désordonnés que personne ne s'occupe même de.

Une approche encore meilleure serait de définir foo comme une interface que implémentit et donotimplementit implémente (sonne bizarre, mais vous l'obtenez). Vous sauve à partir de ce Résumé remplacement . De cette façon, vous pouvez également masquer votre interface de l'extérieur en le faisant interne


3 commentaires

Vous voulez dire que la classe abstraite dérive de la première classe? Il y a des problèmes d'accessibilité ( public ) et avec nommage ( bar ne peut pas être une méthode d'une classe bar ).


@Jeppestignielsen Yeap, i ment de remplacement foo -Class. J'ai aussi changé les noms des membres.


Cela a aidé, mais vous avez toujours un problème avec la barre de classe dérivée étant public pendant que sa classe de base n'est pas.



0
votes

Vous pouvez écrire un analyseur de code personnalisé . Je ne l'ai jamais utilisé moi-même. Nous avons commencé à utiliser FXCop et avons écrit quelques règles personnalisées pour cela. Mais c'est assez difficile à faire. Avec Roslyn, cela devrait être beaucoup plus facile.


0 commentaires

1
votes

code d'écriture qui a le même effet que l'application de la loi.

  • Faites une interface contenant les méthodes / propriétés que vous souhaitez remplacer. li>
  • Écrivez une fonction (ultérieure) qui retourne l'interface. LI>
  • Donc, quand c'est remplacé, toutes les fonctions sont remplacées à la fois. Li> ul>

    Exemple: P>

    public interface IBarMethods
    {
        void Bar();
        Task BarAsync();
    }
    
    public class Foo
    {
        public virtual IBarMethods DeMethods()
        {
            // return class containing default methods.
        }
    }
    
    public class ImplementIt : Foo
    {
        public override IBarMethods DeMethods()
        {
            // return different methods.
        }    
    }
    


1 commentaires

Lorsque vous faites ce foo peut même avoir une méthode (scellée) bar et une méthode (scellée) barasync qui vient d'obtenir ce ibAmméthod < / code> objet et appelle la méthode appropriée. De note si j'irais probablement avec une propriété, plutôt qu'une méthode, pour obtenir l'instance ibarmethods (A protégé un dans mon cas).