2

Ich verwende Unity, wo es ein paar sehr häufige Methoden gibt, wie Start() und Update(). Immer wenn ich von einer anderen Klasse erben, überschreibe ich die Methoden des Elternteils, aber ich vergesse immer, base.ParentMethod(); anzurufen.Wie kann ich mich daran erinnern, den Elternteil anzurufen?

Gibt es eine Möglichkeit, die ich davon abhalte? Es verursacht viele Bugs, nach denen ich viel Zeit suche. Gibt es eine Einstellung in Visual Studio, die automatisch die Basismethode aufruft, wenn ich etwas überschreibe? Gibt es eine Art von Überprüfung, die ich tun kann, um zu sehen, welche Methoden ich vergesse, um die Basis aufzurufen?

Im Idealfall möchte ich Visual Studio dazu zwingen, eine Warnung zu geben, wenn ich den Basistruf vergesse. Kann ich das oder etwas Ähnliches machen?

+0

Die Art, dies zu tun, hängt von der Version von Visual Studio ab, die Sie verwenden. Es gibt Funktionen im Jahr 2015, die das viel einfacher machen. Sie können einen Analysator schreiben, um festzustellen, ob Sie einen Fehler machen. Löst nicht Ihr Problem, aber dieses könnte Sie interessieren https://github.com/meng-hui/UnityEngineAnalyzer –

+1

Ehrlich gesagt müssen Sie nur in die Gewohnheit herausfinden herauszufinden, was die Basis-Implementierung tut und für sich entscheiden, ob Sie oder nicht _need_ um es zu nennen. Je nach Situation möchten Sie die Basisimplementierung nicht immer aufrufen. Manchmal wäre es sogar ein Fehler, eine Basisimplementierung aufzurufen. Es gibt keine Möglichkeit für VS, das für Sie zu wissen. –

+0

@ScottChamberlain Vielen Dank für Ihr Feedback. Ich benutze Visual Studio 2015 als eine Tatsache – Evorlor

Antwort

3

Ein gängiger Ansatz für dieses Problem ist die Verwendung der Template Method pattern. In der Basisklasse, macht das Verfahren versiegelt und ruft eine andere abstrakte oder virtuelle Methode:

public sealed TheMethod() 
{ 
    // Do something that should always be done 
    DoSomethingImportant() 

    // Call the derived class implementation 
    TheMethodCore(); 
} 

protected abstract void TheMethodCore(); 

Auf diese Weise gibt es keine Möglichkeit für die abgeleitete Klasse zu „vergessen“ die Basismethode zu nennen; DoSomethingImportant wird immer angerufen.

1

Anstatt die Basismethode manuell zu überschreiben, wenn Sie Ihre Klasse wie folgt mit Vererbung definiert haben: Geben Sie override ein und klicken Sie auf spacebar, wodurch alle Methoden aufgerufen werden, die überschrieben werden können. Sobald Sie eines der Member der Basisklasse ausgewählt haben, wird automatisch der Methoden-Stub zusammen mit der Zeile base.method(); im überschriebenen Methodenkörper generiert.

public class myclass : parentclass 
{ 

} 

** Wenn nicht falsch, funktioniert dieser Trick auch in Visual Studio 2010

0

Das von Visual Studio ausgeführt wird, wenn Sie nur überschreiben und wählen Methode aus InteliSense schreiben. Seit Roslyn können Sie jedoch auch einen Analysator erstellen (oder einen finden), der ihn nach der Kompilierung überprüft und einige Warnungen/Informationen unterdrückt (ich bin mir nicht sicher, ob er für die Unity verfügbar ist).