2010-11-18 14 views
3

Ich habe das schon einmal gemacht - kann mich einfach nicht mehr an den Trick erinnern.Abstract/Virtuelle Mitglieder bieten gemeinsame und abgeleitete kombinierte Funktionalität - C#

Wenn ich habe eine abstrakte Klasse:

public abstract class Beitrag

und eine Reihe von Ableitung Klassen:

public class Foto Post

Ich möchte force die abgeleiteten Klassen zur Implementierung einer Methode namens Validate(), aber zur gleichen Zeit zur Verfügung Kern Validierung bei der Post Ebene.

kann ich eine Methode erstellen: public void Validate() in Beitrag, der die Ableitung Klassen zwingen würde, das Verfahren zu implementieren, aber dann, wie führe ich die Beitrag (Basis) Validierung?

Das Endergebnis ist, ich möchte, dies zu tun in der Lage:

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

Wie kann ich es tun?

Antwort

10

Hier ist, was Sie wollen:

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(); 
} 

Dies wird Basisklassen zwingen, eine Validierungstechnik zu implementieren, und die Basis Validate wird durch externe Benutzer aufgerufen.

Es ist nicht möglich, eine Methodenzusammenfassung zu erstellen und eine Standardimplementierung bereitzustellen.

+0

Ahhh - das ist es! Brilliant - Prost. :) – RPM1984

+0

@RPM, froh zu helfen! – jjnguy

4

eine öffentliche Template-Methode in der Basisklasse erstellen und sie haben die abgeleitete Klasse Validierungsmethode nennen:

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

    protected abstract void ValidateDerived(); 
} 

Diese Kräfte abgeleiteten Klassen, das Verfahren zu implementieren, bietet aber gemeinsame Validierungslogik für die Klasse Post. Beachten Sie, dass Validate() nicht selbst virtuell ist. Dies ist sicherer, als abgeleitete Klassen zu zwingen, sich daran zu erinnern, base.Validate() aufzurufen.

+0

Ist das anders als meine Antwort? – jjnguy

+1

Kein Unterschied. Deine Antwort war nicht da, als ich anfing, die Frage zu beantworten. Ich habe Ihre Antwort als höflich eingestuft. –

+0

Ich werde den Gefallen erwidern. Ich wollte auch nicht unhöflich klingen. Ich war nur neugierig, ob du etwas anderes meintest als das, was ich gepostet habe. – jjnguy