*
Hi µ, danke für deine Hilfe!
Ich glaube du hast mich teilweise etwas missverstanden. Ich weiß wie das Strategiemuster funktioniert, ich bezog mich mit basisklasse und ableiten davon nicht auf die policies/strategien selbst, sondern auf die Body-Klassen, die die policies verwenden.
Im moment sieht es so aus:
Body ist die abstrakte basisklasse aller bodies
davon leitet die konkrete klasse StaticBody ab und die abstrakte Klasse DynamicBody.
DynamicBody hat zwei abstrakte properties:
protected abstract JumpPolicy JumpPolicy {get; }
protected abstract AccelerationPolicy AccelerationPolicy {get; }
, über die es auf die policies zugreift, die von abgeleiteten klassen überschrieben werden müssen.
Ich hatte dort vorher einen konstruktor, der 2 policies übergeben bekommt und diese dann in protected referenzen auf die basisklassen der policies abgespeichert hatte, aber das aufrufen des basisklassenkonstruktors wurde dadurch sehr abenteuerlich und die Typinformationen gingen verloren (das war das was ich mit downcast angesprochen hatte).
Das sah dann ungefähr so aus:
protected JumpPolicy jumpPolicy;
protected AccelerationPolicy accelerationPolicy;
protected FarseerBody body;
public DynamicBody(FarseerBody body, JumpPolicy jumpPolicy, AccelerationPolicy accelPolicy)
{
this.body = body;
this.jumpPolicy = jumpPolicy;
this. accelerationPolicy = accelPolicy;
}
Das mit den abenteuerlichen Konstruktoren lag daran, dass ich erst einen FarseerBody (body von der physicsengine) erstellen musste, dann 2 policies, die auch eine referenz auf den farseerBody brauchen und dann alle 3 sachen dem basisklassenkonstruktor übergeben werden musste.
Ich hatte einige private konstruktoren gebraucht über die ich umleiten konnte um überhaupt die argumente für die basisklasse zu initialisieren.
Deswegen habe ich es jetzt über abstrakte properties gelöst.
Das mit dem Downcast hat sich damit auch erledigt.
Vorher war es so, dass die basisklasse die policies abspeichert (mit referenz auf basisklassen der policies). Jetzt speichert die abgeleitete klasse selbst seine policies (mit referenz auf konkreten typ) und überschreibt die abstrakten properties, um der basisklasse zugriff zu gewähren.
Bei der Lösung bleibt es allerdings dabei, dass ich für jeden Möglichen body eine neue Klasse ableiten muss um die abstrakten properties zu überschreiben.
z.B. brauche ich dann LinearAcceleratedJumpingBody und viele weitere ausprägungen.
Allerdings finde ich das nicht besonders schlimm, da diese klassen sehr schnell geschrieben sind und ich dann dort auch noch weitere anpassungen vornehmen kann.
Die Beschränktheit der Generics ist sehr schade, das ist fast genauso wie bei java... Templates sind da wirklich wesentlich mächtiger.
Ich kenne .Net Remoting zwar nicht, aber ich habe meine Zweifel, dass es mir was hilft. Erstens wird das vermutlich einen ziemlichen overhead haben (für metainformationen usw. und ich kann dann vermutlich nicht mehr so selektiv serialisieren wie bisher) und außerdem wird vermutlich alles über tcp gehen. Mit Lidgren bin ich da meiner meinung nach wesentlich besser bedient, das ist extra auf spiele ausgelegt.