Diesmal habe ich Probleme mit virtuellen Feldern.C# Polymorphie Frage noch einmal - vorrangige Felder?
Ich habe Kernklasse für meine Spielobjekte. Diese Klasse enthält ein Feld mit dem Model-Klassenobjekt. Modell-Objekt enthält Werte wie Position usw.
Jetzt - während des Zeichnens muss ich die Position jedes Objekts aus seinem Modell lesen. Das Problem beginnt, wenn ich anstelle der Standardmodellklasse abgeleitet bin. Beispiel:
abstract class GenericGameObject { public DefaultGameObjectModel Model = new DefaultGameObjectModel(); }
class Missile : GenericGameObject { public new MissileModel Model = new MissileModel(); }
class DefaultGameObjectModel { public Vector2 Position = new Vector2(){X=0}; }
class MissileModel : DefaultGameObjectModel { }
Missile m = new Missile();
m.Model.Position.X = 10;
// NOT OK! ((GenericGameObject)m).Model.Position.X == 0
Ich habe versucht, Modell definiert als virtuelles Eigentum statt Feld zu machen, aber dies nicht gelingt, weil abgeleiteten Eigenschaften von derselben Art wie ihre Basis sein. Casting ist zwecklos, weil es viele andere Modelltypen geben wird. Was kann ich tun, wenn ich einen Wert aus der abgeleiteten Klasse lesen möchte, nicht aus der Basis?
Ich habe diese Frage schon gestellt, aber die Antwort brachte keine Lösung. Explaination:
verwenden Schnittstelle IGameObjectModel
Konzept ist gut, aber ich muss Felder erzwingen. Schnittstellen können keine Felder definieren, daher muss ich Eigenschaften definieren. Aber ich kann IGameObjectModel.Position.X = 10 nicht ausführen, weil Position kein Feld ist.
machen GenericGameObject ein generischer Typ wie GenericGameObject und Missile eine Art von GenericGameObject abgeleitet ich dann nicht eine Rakete zu GenericGameObject werfen könnte und speichern im Allgemeinen jene Objekt auf derselben Liste. Natürlich könnte ich den Hauptbasistyp festlegen, von dem diese beiden erben könnten, aber dann hätte ich keinen Zugriff auf das Modellfeld.
um Modell eine Eigenschaft anstelle von Feld zu machen. Es ist nicht möglich, den Eigenschaftstyp in der abgeleiteten Klasse zu ändern.
Was kann ich tun?
„Was kann ich tun?“ - Sie können mit der Bearbeitung Ihrer vorherigen Frage beginnen, anstatt eine neue Frage zu stellen. –
Hm, du hast Recht, ich habe nicht darüber nachgedacht, sorry. Es scheint unmöglich zu sein, die Frage für den nicht registrierten Benutzer zu löschen, aber sicher würde ich das nächste Mal das bestehende bearbeiten. Danke :) –
Es gibt keine "virtuellen Felder". Nur Eigenschaften oder Methoden können virtuell sein. – mmmmmmmm