2009-03-18 14 views
0

Ich habe eine Klasse Request.csWas ist das? Template-Methode oder was?

Es eine abstrakte Methode hat:

public abstract Response CreateResponse(XmlReader reader); 

und es gibt auch eine Methode:

public Response SendRequest(string requestURI) 
{ 
    ... 

    XmlReader reader = XmlReader.Create(responseStream); 

    return CreateResponse(reader); 
} 

Die CreateResponse method wird in einer Unterklasse implementiert, die Request erstreckt. Und diese Implementierung gibt die Antwort zurück.

Ich verstehe nicht, wie man eine Methode, wie diese zurückgeben kann, die eine abstrakte Methode ist aber der Wert zurückgegeben wird, ist tatsächlich in der Durchführung des Verfahrens aus der Unterklasse. Ist das ein Beispiel für den Template Method pattern oder einfach nur Polymorphismus, oder ist das "kniffliger oder zu schlauer" Code oder gar chaotisch? Ich versuche herauszufinden, wie dies überhaupt gemacht werden kann (ist das grundlegende OOP-Prinzip oder Design-Muster) und ist dies eine gute Praxis oder eine gute Verwendung von OOP?

Antwort

1

Ja, das ist Template-Methode. Da die Response-Klasse abstrakt ist, müssen Sie CreateResponse implementieren, bevor Sie SendRequest aufrufen können. Auf diese Weise wird die allgemeine Logik in der Basisklasse gekapselt und der Rest der Logik kann je nach Bedarf variieren (indem mehrere Implementierungen der Basisklasse erstellt werden).

+0

Vielen Dank für die Bestätigung, dass für mich. Habe noch nie eine Template-Methode benutzt. – user72603

1

Dies ist ein sehr Standardansatz. In der Tat wird es oft empfohlen. Die Methode ist wie ein Leerzeichen, das von der abgeleiteten Klasse ausgefüllt werden muss.

+0

Danke, ich war mir einfach nicht sicher ... habe das noch nie zuvor gesehen. – user72603

+0

also ist dies kein Template-Methode Muster oder ist es etwas? – user72603

+0

Es ist einfacher, wenn Sie dies nur als eine andere Form der Parametrisierung betrachten - indem Sie einer "Lücke" einen Namen geben, die ausgefüllt werden muss, um etwas zu nutzen; im Wesentlichen die gleiche Idee wie eine Funktion, die Parameter annimmt, oder eine generische Art der Übernahme von Parametern und so weiter. –

0

Der Hauptgrund dafür ist, dass, wenn Sie die Methode verwenden, die Sie nie nur die Schnittstelle über die Details kennen und eine abstrakte Methode, dass definiert hat.

Sein als die Methode abstrakt ist es keine Details hat, da sie von der abgeleiteten Klasse definiert werden müssen. Der Hauptpunkt, der dies ermöglicht, ist, dass die "INs" und "OUTs" sich niemals ändern, da die Methode in der Basis abstrakt ist, daher ist die Schnittstelle definiert, nur die Implementierung ... noch nicht.

Denken Sie daran, wie jemand grundlegenden Flugtickets von Punkt A Verkauf nicht nach B zu wissen, welcher Fluggesellschaft verwendet werden würde. Sie haben keine Ahnung, wie Sie dorthin kommen werden, aber sobald sie den Vertrag des verkauften Tickets an eine Fluggesellschaft übergeben, wird diese Fluggesellschaft die Details der Einhaltung der Vertragsbedingungen herausfinden. Alles, was Sie interessiert beim Kauf des Tickets war, dass Sie wussten, für x Dollar, die Sie von A nach B bekommen würden.

0

Dies ist Template-Methode, und Template-Methode ist wirklich nicht viel mehr als einfache Polymorphie. Dies ist genau die Art von Sache, für die typischer C#/Java-style OO Polymorphismus gedacht ist und eine gute Verwendung der Sprache ist.