Lokale variablen für den Basisklassenkonstruktoraufruf?
-
Hallo zusammen, ich hatte heut folgendes Problem:
Beim aufrufen des Basisklassenkonstruktors muss ich eine Variable (A) übergeben und gleichzeitig eine andere Variable(B), die ich mit dem Objekt, dass ich zuerst übergebe (A) initialisieren will.
Ich müsste also erst eine Variable definieren, dieser ein neu konstruiertes Body objekt zuweisen und dann damit die weiteren Parameter erstellen um dann alle Parameter weiterzugeben.
Das Problem ist, dass ich für den Basisklassenkonstruktoraufruf soweit ich weiß keine Variablen definieren kann.
Ich habe eine (wie ich finde etwas unschöne) Lösung gefunden (überladen des Konstruktors), und wollte fragen, ob ihr vielleicht bessere Alternativen kennt.
Also hier mal das Problem mit meiner bisherigen Lösung://Problem: Konstruktoren von ExponentialAcceleration und Jumping können nicht sofort aufgerufen werden, weil dafür der body erstellt sein muss... public AcceleratedJumpingBody(World world, ref AccelerationParameters accelParams, ref JumpParameters jumpParams) :this(BodyFactory.CreateBody(world), ref accelParams, ref jumpParams) { } //Lösung durch überladen mit einem privaten Konstruktor private AcceleratedJumpingBody(FarseerPhysics.Dynamics.Body farseerBody, ref AccelerationParameters accelParams, ref JumpParameters jumpParams) : base(farseerBody, new ExponentialAcceleration(farseerBody, ref accelParams), new Jumping(farseerBody, ref jumpParams)) //zur konstruierung von ExponentialAcceleration und Jumping wird der body gebraucht, der vom anderen Konstruktor erzeugt wird. { }
Ich hoffe, dass das Problem verständlich ist und das es da bessere Lösungen gibt.
Vielen Dank schonmal für eure Hilfe!
-
Eventuell wäre eine Has-A beziehung besser als eine Is-A? Dann kannst du die innere Klasse Initialisieren sobald du alle Variablen hast.
Also Möglichkeiten die ich sehe:
1. Has-A.2. Initialisieren mit einem Default und nachträglich Variable B in der Basisklasse anpassen.
3. Basisklasse anpassen, z.B. eine "Initialize" Methode anbieten um die Werte nachträglich zu setzen.
Getreu dem Prinzip "Favour Composition over Inheritance (FCoI)" tendiere ich zu ersterem.
Deine Aktuelle Lösung gefällt mir deswegen nicht weil da zuviel im : base(*) gemacht wird.
-
Die Basisklasse von AcceleratedJumpingBody ist DynamicBody. Ich denke, dass hier eine is-A beziehung schon am treffendsten ist.
Die abgeleitete Klasse (AcceleratedJumpingBody) macht eigentlich nichts weiteres, als 2 Policies zu erzeugen und an die Basisklasse zu übergeben, die schon alle Logik drin hat, nur noch die Policies benötigt.
Ich könnte statt abzuleiten im Prinzip auch eine statische Methode bereitstellen, die den DynamicBody mit den entsprechenden Policies erzeugt, aber ich dachte, dass ich mit einer abgeleiteten Klasse später noch mehr spziellere Sachen hinzufügen kann.2. und 3. haben den Nachteil, dass nicht sichergestellt ist, dass nach dem Konstruktoraufruf alles in einem konsistenten Zustand ist.