2010-11-18 6 views
3

Je l'ai déjà fait - je ne me souviens plus de l'astuce.Résumé/Membres virtuels pour fournir une fonctionnalité combinée commune et dérivée - C#

Si j'ai un abstrait classe:

public abstract class Poster

Et un ensemble de dérivant classes:

public class Photo: Poster

Je veux force les classes dérivées pour implémenter une méthode appelée Valider(), mais en même temps fournissant base validation au niveau Post niveau.

Je peux créer une méthode: public abstract void Valider() dans post, qui forcerait les classes dérivées à mettre en œuvre la méthode, mais comment puis-je effectuer la validation post (base)?

Le résultat final est que je veux être en mesure de le faire:

public class BLL 
{ 
    public void AddPost(Post post) 
    { 
     post.Validate(); // includes "Post" validation, any deriving validation. 
     repository.Add(post); 
    } 
} 

Comment puis-je le faire?

Répondre

10

Voici ce que vous voulez:

public abstract class Post { 

    // Default validation technique 
    public void Validate() 
    { 
     // your base validation 
     // Then call the specific validation technique 
     ExtraValidate(); 
    } 

    // Forces subclasses to provide validation technique 
    protected abstract void ExtraValidate(); 
} 

Cela forcera les classes de base pour mettre en œuvre une technique de validation, et la base Valider sera appelé par les utilisateurs externes.

Il est impossible de rendre une méthode abstraite et de fournir une implémentation par défaut.

+0

Ahhh - c'est tout! Brillant - à la vôtre. :) – RPM1984

+0

@RPM, heureux d'aider! – jjnguy

4

Créer une méthode de modèle public dans la classe de base et l'ont appeler la méthode de validation de classe dérivée:

public abstract class Post { 
    public void Validate() { 
     // Post validation 
     ValidateDerived(); 
    } 

    protected abstract void ValidateDerived(); 
} 

Cette forces dérivées des classes pour mettre en œuvre la méthode, mais fournit une logique de validation commune pour la classe Post. Notez que Validate() n'est pas virtuel lui-même. C'est plus sûr que de forcer les classes dérivées à se rappeler d'appeler base.Validate().

+0

Est-ce différent de ma réponse? – jjnguy

+1

Aucune différence. Votre réponse n'était pas là quand j'ai commencé à répondre à la question. J'ai upvoted votre réponse pour être poli. –

+0

Je vais retourner la faveur. Je ne voulais pas paraître impoli non plus. J'étais juste curieux de savoir si vous vouliez dire quelque chose de différent de ce que j'avais posté. – jjnguy

Questions connexes