Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Instanzen verschiedener Subklassen in einer Liste speichern (https://www.delphipraxis.net/147954-instanzen-verschiedener-subklassen-einer-liste-speichern.html)

Mylet 19. Feb 2010 16:43


Instanzen verschiedener Subklassen in einer Liste speichern
 
Ich programmiere momentan ein rundenbasiertes Strategiespiel mit RPG-Elementen.
Man kann ein Team aus Kämpfern auf einer schachbrettartig aufgeteilten Karte bewegen und muss Kämpfer des gegnerischen Teams bekämpfen und besiegen, um zu gewinnen.
Die Einheiten haben eine Anzahl von Statuswerten mit denen der Ablauf der Kämpfe berechnet wird, zusätzlich spielen die verwendeten Waffen eine Rolle.

Ich möchte jetzt den Einheiten die Möglichkeit geben Items zu tragen, womit wir bei meinem Problem wären.

Mein Ansatz ist die folgende Basisklasse:

Delphi-Quellcode:
type TItem = class
  private
    FName: string;
    FBeschreibung: String
    FGewicht: Integer;
    FAnzahl: Integer;
    FPreis: Integer;
  public
    function IstBenutzbar (var Benutzer: TKämpfer): Boolean; virtual; abstract; //jedes Item soll hier prüfen ob es vom Besitzer benutzt werden kann
    procedure Benutze (var Benutzer: TKämpfer); virtual; abstract;             //hier soll das Item etwas mit sich (Anzahl reduzieren) und/oder dem Kämpfer machen
    procedure WriteToStream (AStream: TStream);
    procedure ReadFromStream (AStream: TStream);
    property Name: string read FName;
    //restliche properties
end;
von der würde ich dann die einzelnen Items ableiten.

Das konkrete Problem bei der Realisierung stellt sich beim Speichern bzw. Laden eines Kämpfers mit seinen Items.
Ich kann zwar durch eine Liste der Items gehen und diese nacheinander in einen Stream schreiben, aber beim Laden stellt sich dann die Frage, von welcher Klasse das Item ist.
Gibt es irgendeine Möglichkeit die Klasse eines Objektes zu Speichern und beim Laden die Daten entsprechend zuzuordnen?

Ich bin mir im Klaren darüber, dass das Ableiten einer neuen Klasse für jedes Item ziemlich aufwändig (und umständlich?) ist, aber mir fällt keine andere Möglichkeit ein wie ich die Überprüfung der Benutzbarkeit und die Anwendungsprozedur einem bestimmten Item zuordnen kann.
Wenn jemand dahingehend einen Vorschlag hat, würde sich das obrige Problem evtl. erübrigen.

himitsu 19. Feb 2010 16:52

Re: Instanzen verschiedener Subklassen in einer Liste speich
 
Das VAR ist nicht nötig, wenn der "Spieler"/Benutzer nur geprüft/verglichen werden soll.

Und eine einfache Lösung deines Problemes (so macht es die VCL ja auch):
Du speicherst vor jedem Stream/Objekt den Typ dieses Objektes und so weißt du dann beim Laden welchen Typen du benötigst.

Mylet 19. Feb 2010 17:24

Re: Instanzen verschiedener Subklassen in einer Liste speich
 
Ja, das VAR bei der function ist tatsächlich unnötig, danke.

Meinst du mit dem Typ des Objektes das, was die TObject.ClassType-function angibt? Wie schreibe ich so ein TClass-Objekt in einen Stream? Kann ich da einfach
Delphi-Quellcode:
var ItemClassType: TClass;
.
.
.
ItemClassType := TItemNachfahre.ClassType;
MyStream.WriteBuffer(ItemClassType,SizeOf(ItemClassType));
benutzen?

Und bezüglich des Ladens: Wie kann ich vom gespeicherten Typ des Objektes direkt auf die Klasse zugreifen? Ich will schließlich keine riesige 'case ClassType of' -Abfrage schreiben müssen...

himitsu 19. Feb 2010 18:07

Re: Instanzen verschiedener Subklassen in einer Liste speich
 
Am Besten du speicherst den Klassennamen.

TClass ist ein Zeiger (zu den zugehörenden RTTI-Infos) und dieser würde sich beim nächsten Kompilieren vermutlich ändern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz