Frage

Ich habe das schon mal gemacht -. Einfach nicht den Trick erinnern kann

Wenn ich habe eine abstrakt Klasse:

public abstract class Beitrag

Und eine Reihe von Ableiten Klassen:

public class Foto Post

Ich will Kraft die Ableitung Klassen eine Methode zur Implementierung namens Validate () , aber zugleich die Bereitstellung Kern Validierung bei der Post Ebene.

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

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

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

Wie kann ich es tun?

War es hilfreich?

Lösung

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 unmöglich, ein Verfahren abstrakt zu machen, und eine Implementierung Standard bieten.

Andere Tipps

Erstellen Sie ein Template-Methode in der Basisklasse und haben es die abgeleitete Klasse Validierungsmethode aufrufen:

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

    protected abstract void ValidateDerived();
}

abgeleitet Dies zwingt Klassen das Verfahren zu implementieren, bietet aber gemeinsame Validierungslogik für die Klasse Post. Beachten Sie, dass Validate () selbst ist nicht virtuell. Dies ist sicherer als abgeleitete Klassen zwingen zu müssen bedenken, base.Validate () aufrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top