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 Réponses :
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: p> maintenant client peut concevoir s'il a besoin d'une implémentation de 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. p> Une approche encore meilleure serait de définir
Vous voulez dire que la classe abstraite dérive de la première classe? Il y a des problèmes d'accessibilité (
@Jeppestignielsen Yeap, i ment de remplacement
Cela a aidé, mais vous avez toujours un problème avec la barre de classe dérivée foo code> avec votre comportement par défaut (=
donotimplementit code>) ou s'il a besoin d'un personnalisable Version à l'aide de
Mise en œuvre code>. Dans le premier cas, il est obligé de remplacer les membres dans ce dernier cas non. P>
foo code> comme une interface que
implémentit code> et
donotimplementit code> implémente (sonne bizarre, mais vous l'obtenez). Vous sauve à partir de ce
Résumé remplacement code>. De cette façon, vous pouvez également masquer votre interface de l'extérieur en le faisant
interne
public code>) et avec nommage (
bar code> ne peut pas être une méthode d'une classe
bar code>).
foo code> -Class. J'ai aussi changé les noms des membres.
code> étant
public code> pendant que sa classe de base n'est pas.
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. P>
code d'écriture qui a le même effet que l'application de la loi.
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. } }
Lorsque vous faites ce foo code> peut même avoir une méthode (scellée)
bar code> et une méthode (scellée)
barasync code> 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 code> (A
protégé code> un dans mon cas).
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.