Entwurfsmuster Template-Methode bei Konstruktor nicht anwendbar?
-
Hallo zusammen,
ich hatte in letzter Zeit gleich 2 mal folgendes Problem:
Ich wollte eine Template-Methode (Entwurfsmuster) benutzen undzwar beim Konstruktor.
Die abgeleiteten Klassen sollen also einen Teil der Konstruktion übernehmen.
Z.B. hatte ich eine Level-Klasse und dann wollte ich eine abstrakte Methode createObjects() machen und diese im Basisklassenkonstruktor aufrufen.
Jetzt habe ich das gleiche mit einer ActorPhysics-Klasse, bei der ich eine abstrakte Methode createBody() machen wollte und diese dann im Basisklassenkonstruktor aufrufe.Das geht leider nicht, weil im Konstruktor virtuelle Methoden nicht richtig funktionieren.
Wenn ich das allerdings anders mache, z.B. den Body protected mache, oder nen protected setter für den Body mache, dann kann es passieren, dass man in der abgeleiteten Klasse ganz einfach "vergisst", den Body zu erstellen.
Gibts da irgendwelche Auswege (allgemein und für beide speziellen fälle)?
-
Was spricht denn dagegen, wenn jede Klasse ihre eigenen Daten selber im Konstruktor-Rumpf initialisiert? (im Notfall würde ich gern sehen, was diese createBody()-Methode eigentlich machen soll - und warum die Basisklasse darauf angewiesen ist, daß sie von abgeleiteten Klassen überschrieben wird)
-
Ich benutze box2D.
Erstmal muss der body erstellt werden und dafür muss angegeben werden, ob es sich um einen statischen oder dynamischen körper handelt. Das könnte man noch als Argument für die Basisklasse machen.
Die abgeleiteten Klassen müssen aber die Fixtures für den Body erstellen.
Fixtures geben die Form des Körpers an.
Ich möchte dann von der Klasse was ableiten, was für Rechtecksform da ist, da fast alles ne Rechtecksform braucht.
Ich will mir aber auch die Möglichkeit offenhalten, andere Formen zu verwenden und evtl. später was mit Kreisform abzuleiten.createBody() könnte z.B. so in der Art aussehen:
b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(pixelToBox2D(xPos), pixelToBox2D(yPos)); body_ = world_.CreateBody(&bodyDef); b2PolygonShape boxShape; boxShape.SetAsBox(pixelToBox2D(width/2.f), pixelToBox2D(height/2.f)); b2FixtureDef boxFixtureDef; boxFixtureDef.shape = &boxShape; body_->CreateFixture(&boxFixtureDef); body_->SetUserData(this);Edit: Das ist ja das besondere: Die Daten die dort initialisiert werden, sind eigentlich die der Basisklasse, die abgeleitete Klasse leitet im Grund nur ab, um einen Teil der initialisierung der Basisklasse zu spezifizieren.