Wie verhindert man, dass das Factory-Method-Muster eine Warnung über den Aufruf virtueller Member im Konstruktor verursacht?

8

Auf www.dofactory.com fand ich ein echtes Beispiel für das Factory Pattern. Aber der Code generiert eine Warnung in ReSharper über einen virtuellen Memberaufruf in dem Konstruktor.

Der Code, der die Warnung verursacht, ist folgender:

%Vor%

Im verbrauchenden Code können Sie dann einfach Folgendes verwenden:

%Vor%

Ich verstehe, warum es eine schlechte Idee ist, ein virtuelles Mitglied im Konstruktor aufzurufen (wie erklärt hier ).

Meine Frage ist, wie Sie dies umgestalten können, um immer noch das Factory-Muster zu verwenden, aber ohne den virtuellen Member-Aufruf im Konstruktor.

Wenn ich den Aufruf von CreatePages aus dem Konstruktor entfernen würde, müsste der Konsument explizit die Methode CreatePages aufrufen:

%Vor%

Ich bevorzuge eher die Situation, in der das Erstellen eines neuen Resume alles ist, was benötigt wird, um einen Lebenslauf zu erstellen, der Seiten enthält.

    
comecme 29.06.2012, 21:14
quelle

4 Antworten

2

Eine Möglichkeit, dies zu überarbeiten, besteht darin, die Seiten im Voraus zu übergeben und sie an einen geschützten Konstruktor zu übergeben:

%Vor%

P.S. Ich bin mir nicht sicher, was das mit der Fabrikmethode zu tun hat. Ihr Beitrag zeigt das Vorlagenmethodenmuster .

    
dasblinkenlight 29.06.2012, 21:21
quelle
1

Was ist damit? Es verwendet eine verzögerte Initialisierung, bei der die Seiten nur bei Bedarf erstellt werden (anstatt sie im Konstruktor zu erstellen)

Beachten Sie außerdem, dass die Sichtbarkeit der Factory-Methode in protected geändert wird, um sie vor der öffentlichen Verwendung zu verbergen.

%Vor%

BEARBEITEN Vorschlag: Ich persönlich mag es nicht, diese globale Variable _pages zu haben, da es Sie in Schwierigkeiten bringen könnte, wenn sie unter vielen Methoden und Threads geteilt wird. Ich würde lieber das Muster der Fabrikmethode wählen, wie es im GoF-Buch beschrieben ist. Hier ist mein Vorschlag:

%Vor%     
GETah 29.06.2012 21:24
quelle
1
  

Meine Frage ist, wie Sie dies umgestalten können, um immer noch das Factory-Muster zu verwenden, aber ohne den virtuellen Member-Aufruf im Konstruktor.

Gemäß der Definition

  

Bei der klassenbasierten Programmierung ist das Factory-Methodenmuster ein schöpferisches Muster, das Factory-Methoden verwendet, um das Problem zu lösen, Objekte zu erstellen, ohne die genaue Klasse des Objekts anzugeben, die erstellt wird.

Die

factory-Methode soll nicht vom Konstruktor verwendet werden, da die genaue Klasse des Objekts, die erstellt wird, zur Konstruktionszeit bekannt ist. Zum Beispiel

  1. Wenn Document zur Konstruktionszeit alle Pages erstellen muss, kann dies ohne Factory-Methode erfolgen, da genau alle zu erstellenden Seiten bekannt sind

  2. aber wenn Document später nach der Konstruktion Pages erstellen muss und vielleicht mehrere Male, dann ist die Fabrikmethode nützlich

  

Ich bevorzuge vielmehr die Situation, in der das Erstellen eines neuen Lebenslaufs alles ist, was nötig ist, um einen Lebenslauf zu erstellen, der Seiten enthält.

Wenn also alle Pages zur Konstruktionszeit erstellt werden sollen, kann dieses konkrete Beispiel ohne Verwendung des Fabrikmethodenmusters umgeschrieben werden:

%Vor%
  1. Die Methode Add darf von Resume -Konstruktor verwendet werden, da Document object vollständig aufgebaut und einsatzbereit ist.

  2. Die Methode Add ist geschützt, sodass Seiten nur aus Document oder abgeleiteten Klassen hinzugefügt werden können.

Lightman 23.02.2015 20:15
quelle
0

Sie können dies in der Eigenschaft selbst tun.

In diesem Fall kann die Eigenschaft Pages in der Basisklasse als virtual markiert werden.

Der hypothetische Code für Resume könnte folgendermaßen aussehen:

%Vor%

In diesem Fall werden die Seiten beim ersten Zugriff auf Pages -Eigenschaft und nicht bei ctor -Ausführung erstellt.

    
Tigran 29.06.2012 21:20
quelle