Abstract / Virtuelle Mitglieder zur Bereitstellung von Common & Abgeleitet kombinierte Funktionalität - C #
-
26-09-2019 - |
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?
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.