2012-05-28 8 views
6

Ich habe eine virtuelle Basismethode void Action(), die in einer abgeleiteten Klasse überschrieben wird.C# - Vollständige Rückkehr von der Basismethode

Der erste Schritt in Aktion ist base.Action() aufrufen. Wenn eine Situation in der Basismethode auftritt, möchte ich nicht, dass der Rest der abgeleiteten Methode verarbeitet wird.

Ich möchte wissen, gibt es ein Schlüsselwort oder Design-Muster, mit denen ich die abgeleitete Methode von der Basis-Methode verlassen kann.

Momentan schaue ich mir an, die Lücke zu boolen zu ändern und diese als Flusskontrolle zu verwenden, aber ich habe mich gefragt, ob es noch andere Entwurfsmuster gibt, die ich benutzen könnte.

+0

Nein, es ist keine Fehlersituation, so dass Ausnahmen nicht funktionieren. – Talib

+0

Sorry Gewinn (früherer Eintrag gelöscht, ich brauche keine Lösung), ich brauche immer noch eine Lösung, das System wird ziemlich komplex. Grundsätzlich gibt es eine credits_available Variable woanders im Code. Ich möchte alle Aktionen in der Basisklasse deaktivieren können, wenn keine Credits verfügbar sind. Ich würde gerne in der Lage sein, dies zu tun, ohne dass die abgeleitete Klasse den Code duplizieren muss. – Talib

Antwort

3

Sie es nicht mit void zurück Typ verwenden, aber tun können, sagen bool

public class Base 
{ 
    public virtual bool Action() 
    { 
     .. 
     return boolean-value. 
    } 
} 

public class Child : Base 
{ 
    public override bool Action() 
    { 
     if(!base.Action()) 
     return false; 

     .... 
     return boolean-value; 
    } 
} 

Oder, wenn dies eine Ausnahmesituation ist, eine Ausnahme auslösen, wie andere vorschlagen.

+0

Dies ist ein bisschen unordentlich, da es einen Verbraucher der Klasse eine unnötige Implementierung exponiert. – Slugart

+0

@Slugart: über welche Implementierung sprichst du? – Tigran

+0

Entschuldigung bedeutet Implementierungsdetail - Action macht jetzt die Tatsache deutlich, dass es bool zurückgibt. Was bedeutet das für den Verbraucher der abgeleiteten Klasse? – Slugart

3

Ist dies ein Fehler "Situation"? Wenn dies der Fall ist, lassen Sie es einfach eine Ausnahme auslösen und fangen Sie die Ausnahme innerhalb der Überschreibung nicht ab.

Wenn es sich nicht um eine Fehlersituation handelt, klingt die Verwendung des Rückgabetyps zwar nach vorne, ist aber für Ihren Kontext möglicherweise nicht geeignet - wir wissen nicht genau, was Sie erreichen möchten.

Eine weitere Option ist das verwenden template method pattern:

public abstract class FooBase 
{ 
    public void DoSomething() 
    { 
     DoUnconditionalActions(); 
     if (someCondition) 
     { 
      DoConditionalAction(); 
     } 
    } 

    protected abstract void DoConditionalAction(); 
} 

Wenn Sie nicht die Basisklasse abstrakt machen wollen, könnten Sie machen es zu einer geschützten virtuellen Methode, die nichts in der Basisklasse hat und außer Kraft gesetzt wird in der abgeleiteten Klasse gegebenenfalls. Beachten Sie, dass DoSomethingnicht virtuell hier ist.

Wenn keine dieser Optionen angemessen klingt, müssen Sie uns konkretere Informationen zu dem geben, was Sie erreichen möchten.

0

Eine Ausnahme in der Basismethode auslösen. Es wird aus jeder Methode, die es aufgerufen hat, beendet, bis es gefangen wird.

+0

Eine Ausnahme in einer Methode zu werfen, die häufig aufgerufen wird, ist keine sehr gute Idee. –

+0

@Mert: Es ist eine gute Idee in * außergewöhnlichen * Situation, aber es ist eine schlechte Idee für den Kontrollfluss in ** den meisten Fällen. – Tigran

+0

@Mert: Ausnahmen häufig zu werfen ist nicht gut, aber die Ausnahme wird nur geworfen, wenn es "eine Situation" gibt, wie das OP es ausdrückte. Dies geschieht nicht jedes Mal, wenn die Methode aufgerufen wird, da der normale Ablauf den Rest des Codes in der abgeleiteten Methode ausführen soll. – Guffa

Verwandte Themen