AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OOP Frage bei Spiel

Ein Thema von DeerHunter · begonnen am 17. Okt 2004 · letzter Beitrag vom 19. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
DeerHunter

Registriert seit: 8. Jun 2004
16 Beiträge
 
Delphi 6 Professional
 
#1

OOP Frage bei Spiel

  Alt 17. Okt 2004, 04:32
Ich versuche gerade mich ein wenig in OOP zu üben, wozu ich ein kleines Strategiespielchen schreiben wollte. Momentan steh ich vor einem allgemeinen Problem, was den Aufbau des Objektmodells betrifft...

Es gibt Einheiten und Ressourcen auf der Karte, die ich beide jeweils als Klassen definitiert habe, TEinheit und TRessource. Diese sind direkt von TObject abgeleitet, haben also nichts miteinander zu tun.
Ich möchte nun, dass, je nachdem, was der Benutzer gerade angeklickt hat (z.b. eine Einheit), im Infofenster Informationen über dieses etwas stehn. Wenn es eine Einheit ist halt die Werte der Einheit, bei einer Ressource (die man ja auch anklicken können soll) eben wieviel sich noch in diesem Ressourcenfeld befindet.

Die Auswahl habe ich nun in einer TList organisiert, da man bei Einheiten ja durchaus auch mehrere gleichzeitig selektieren kann.
Ich habe also die Pointer auf die Objekte, die gerade markiert sind. Bisher habe ich (als ich nur die Einheiten implementiert hatte) dann so darauf zugegriffen: TEinheit(Liste.Items[i])
Aber es könnte ja auch eine Ressource sein, also gibt es irgendwie eine Möglichkeit, herauszufinden, ob das jeweilige Objekt, auf das der Pointer zeigt, nun vom Typ TEinheit oder TRessource ist?

Oder hat jemand einen Tipp, wie ich das ganze geschickter lösen kann? Natürlich könnte ich verschiedene Listen führen, je nachdem, was gerade für Items selektiert sind.. aber das wäre doch irgendwo unschön und umständlich oder?
Mit OOP Sachen habe ich leider noch nicht so die Erfahrungen, deswegen ist mir völlig fremd, wie man hier am besten vorgeht.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: OOP Frage bei Spiel

  Alt 17. Okt 2004, 05:20
Die RTTI ist dein Freund; schau dir mal den Delphi-Referenz durchsuchenis und den Delphi-Referenz durchsuchenas -Operator an.

\\edit: Hatte die Tags vermurkst...
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
DeerHunter

Registriert seit: 8. Jun 2004
16 Beiträge
 
Delphi 6 Professional
 
#3

Re: OOP Frage bei Spiel

  Alt 17. Okt 2004, 05:50
Ah stimmt, das kommt mir doch bekannt vor

if TObject(Liste.Items[i]) is TEinheit then ... so läuft der Spaß

Danke! damit wär das geklärt
  Mit Zitat antworten Zitat
Benutzerbild von Nonsense
Nonsense

Registriert seit: 23. Nov 2002
389 Beiträge
 
Delphi 5 Standard
 
#4

Re: OOP Frage bei Spiel

  Alt 17. Okt 2004, 11:15
Btw: Wenn du Dich in OOP übst, solltest du TEinheit und TResource nicht von TObject ableiten. Es gibt doch sicherlich viele Geimeinsamkeiten, die man in eine Oberklasse zusammenfügen könnte, oder?
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: OOP Frage bei Spiel

  Alt 17. Okt 2004, 15:16
Zitat von DeerHunter:
if TObject(Liste.Items[i]) is TEinheit then ...
Den Cast nach TObject kann man imho hier auch sparen - bin mir nicht 100%ig sicher, aber müsste...
Ansonsten ist das genau was ich meinte .

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
DeerHunter

Registriert seit: 8. Jun 2004
16 Beiträge
 
Delphi 6 Professional
 
#6

Re: OOP Frage bei Spiel

  Alt 18. Okt 2004, 07:01
Zitat von Nonsense:
Btw: Wenn du Dich in OOP übst, solltest du TEinheit und TResource nicht von TObject ableiten. Es gibt doch sicherlich viele Geimeinsamkeiten, die man in eine Oberklasse zusammenfügen könnte, oder?
ja stimmt schon, habe ich jetzt auch noch gemacht, danke für den tipp

Zitat von dizzy:
Den Cast nach TObject kann man imho hier auch sparen - bin mir nicht 100%ig sicher, aber müsste...
naja, genau daran bin ich anfangs gescheitert.. ohne den Cast ging es nämlich nicht...
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: OOP Frage bei Spiel

  Alt 18. Okt 2004, 09:50
Moin!

Könnte er sich sparen, wenn die Liste z.B. eine TObjectList wäre. Eine TList gibt nur Pointer zurück und die muss man erstmal typecasten auf ein Objekt bevor man damit irgendwelche Is Abfragen machen kann.

MfG
Muetze1
  Mit Zitat antworten Zitat
DeerHunter

Registriert seit: 8. Jun 2004
16 Beiträge
 
Delphi 6 Professional
 
#8

Re: OOP Frage bei Spiel

  Alt 18. Okt 2004, 10:18
Hallo Muetze,
leider war mir TObjectList nicht bekannt.. deswegen hab ich's bisher mit den normalen Lists gemacht... aber wenn es da natürlich soetwas praktisches schon gibt, dann werd ich wohl das ganze mal umändern
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: OOP Frage bei Spiel

  Alt 18. Okt 2004, 10:20
Hmmmm, man merkt dass ich meine Listen meist für den speziellen Fall selber schreibe und nur selten auf TList zurückgreife . Den Unterschied kannte ich so auch noch nicht.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#10

Re: OOP Frage bei Spiel

  Alt 18. Okt 2004, 11:04
Zitat von DeerHunter:
Ich versuche gerade mich ein wenig in OOP zu üben
Hallo DeerHunter,

wenn Du Dich wirklich in OOP üben willst, solltest Du vor allem versuchen, ohne Unterscheidungen der Typen Deine Funktionalität abzubilden. Also keine Kunstrukte der Art:
Delphi-Quellcode:
case myObject.ClassType of
  TMyClass1: DoSth;
  TMyClass2: DoSthElse;
  ...
zu verwenden (zumal dies in Delphi ohnehin nicht ohne weiteres mit einem case möglich ist), sondern Delegation und Vererbung ausnutzen.
Möchtest Du bspw. einen unterschiedlichen Text in Abhängigkeit der Klasse ausgeben, könnte eine Lösung so aussehen:
Delphi-Quellcode:
type
  TMyBaseClass = class
  public
    function GetText: string; virtual; abstract;
  end;
  
  TMyClassA = class(TMyBaseClass)
  public
    function GetText: string; override;
  end;
  
  TMyClassB = class(TMyBaseClass)
  public
    function GetText: string; override;
  end;
Deine Liste erwartet dann lediglich Exemplar der Klasse TMyBaseClass und führt die Operation GetText aus.

Verfolgt man diesen Ansatz konsequent (zB für das Zeichnen, Laden, Speichern, Bewegen, etc.), kann der Klient (der Programmteil, der mit heterogenen Klassen arbeitet) zwar von der konkreten Klasse abstrahieren, jedoch überfrachtest Du entweder Deine Klassen mit zu vielen Methoden und schaffst eine Art "ich kann alles"-Klasse, die wohl schwer zu beherrschen sein wird (typisch für Delphi-Programme ) , oder Du machst Dich zu sehr von einer strikten Vererbungslinie abhängig.

Wenn Du an diesem Punkt angekommen sein solltest, lohnt sich ggf ein Blick in die Menge von Entwurfsmustern (hier: Besuchermuster/Visitor Pattern) oder der Einsatz von Interfaces.

Viel Erfolg!
gruß, choose
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 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