Vererbte Klassen in einer Liste -> Bestimmte Funktion wäh

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Vererbte Klassen in einer Liste -> Bestimmte Funktion wäh

BeitragMo, März 22, 2010 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.

Ich hänge grade in meinem BMax Programm.
Das ganze sieht folgendermaßen aus:
Ich habe eine Klasse TBase. Diese ist abstrakt.
Daraus leiten sich TPlayerBase, TEnemyBase und TNeutralbase ab.
Wenn ich eine neue Basis egal welchen Types erstellen lasse, so wird diese der Liste AllBases, welche eine globales Attribut von TBase ist, hinzugefügt.

In meiner Hauptschleife gehe ich dann die Liste durch und lasse die entsprechenden Basen an ihren Koordinaten zeichnen.
Jetzt möchte ich aber vorher noch überprüfen, ob eine Basis eine TPlayerBase ist, da bei dieser das Bild geändert werden kann.
Nur diese besitzt die Methode "SetImage()".

Folgender COde funktioniert offensichtlich nicht:

BlitzMax: [AUSKLAPPEN]
While Not KeyHit(key_escape) Or AppTerminate()
Cls

SetColor 255, 255, 255

TileImage WaterTile, 0, 0, 0

For Local Base:TBase = EachIn TBase.AllBases

Base.SetImage() 'Hier das mag der Kompiler nicht

SetColor Base.iRed, Base.iGreen, Base.iBlue
DrawImage Base.tiDrawnImage, Base.iX, Base.iy

Next

Flip
Wend


Ich hab das BMax OOP Tutorial von Michael Zehr als Hilfe.
Dort steht etwas mit Klassen konvertieren, wenn sie abgeleitet wurden:

BlitzMax: [AUSKLAPPEN]
Type Bus Extends Fahrzeug 
Field Passagiere:Int
End Type

Local liste:TList = New TList
Local a:Auto = New Auto
Local b:Bus = New Bus

liste.AddLast(a)
liste.AddLast(b)

For Local f:Fahrzeug = EachIn liste

Print f.Geschwindigkeit

If Auto(f)
a = Auto(f)
Print a.Reifen
a.Hupen()

ElseIf Bus(f)
B = Bus(f)
Print b.Passagiere
EndIf

Next


So wie ich den Code aber verstehe, bedeutet das, dass man schon vorher die bestimmte INstanz der Klasse kennen muss (hier: a und b).
Gibt es eine Möglichkeit das ganze so zu schreiben, dass es Variabel ist, also dass man vorher die genaue INstanz nicht kennen muss.
Denn das ist nicht unbedingt dynamisch.
Gemäß dem Fall ich erstelle 50 TPlayerBases die sofort in der Liste gespeichert werden und greife dann nur noch über eine Variable darauf zu.

Ich glaube, dass mein Beitrag etwas verwirrend ist, aber ich hoffe, dass mir trotzdem jemand helfen kann.

Lg, M0rgenstern

das wurgel

BeitragMo, März 22, 2010 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst die Methode nicht aufrufen, da sie in dem Objekttyp von dem die Variable ist, noch abstrakt ist. Du kannst sie aber mittels zielTypenname(variable:quelltypenname) umkonvertieren. Wenn Null herauskommt, gehört die Variable nicht dem Zieltypen an.
1 ist ungefähr 3
  • Zuletzt bearbeitet von das wurgel am Mo, März 22, 2010 23:00, insgesamt einmal bearbeitet
 

n-Halbleiter

BeitragMo, März 22, 2010 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Code ist schon die Lösung gegeben:

BlitzMax: [AUSKLAPPEN]
 If Auto(f) 
a = Auto(f)
Print a.Reifen
a.Hupen()

ElseIf Bus(f)
B = Bus(f)
Print b.Passagiere
EndIf


Du musst für deine Laufvariable der Liste einfach eine Typekonversion durchführen ("If Auto(f)" bzw. "ElseIf Bus(f)") und dann überprüfen, ob diese einen Wert ungleich Null zurückgibt ("<>Null" kannst du dir jedoch sparen). Wenn die Typekonversion fehlschlägt, ist die Instanz keine Instanz des entsprechenden Type.

EDIT: Argh, leicht zu spät. xD
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

M0rgenstern

BeitragMo, März 22, 2010 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Also kann ich das a bzw b mit dem nach der If Abfrage zugegriffen wird nochmal lokal deklarieren?
Da lag mein eigentliches Problem. Das Konzept hatte ich soweit verstanden. Aber halt nicht mit welcher Variable ich darauf zugreifen soll.
So wie ichs verstanden hab war das die, mit der auch die neue INstanz erstellt wurde:

BlitzMax: [AUSKLAPPEN]
Local a:Auto = New Auto 
Local b:Bus = New Bus


In der schleife wird dann ja auch auf a, b zugegirffen:

BlitzMax: [AUSKLAPPEN]
 If Auto(f) 
a = Auto(f)
Print a.Reifen
a.Hupen()

ElseIf Bus(f)
B = Bus(f)
Print b.Passagiere
EndIf


Ob ich dieses a bzw b in der If Abfrage dort direkt Lokal deklarieren kann ist mir nicht klar, bzw wie das genau funktionieren soll.

Lg, M0rgenstern
 

n-Halbleiter

BeitragMo, März 22, 2010 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Variablen a und b sind ja einfach nur Referenzen auf eine Instanz. Wenn du nach der Abfrage den Wert neu setzt, wird es auf die Instanz zeigen, die die Laufvariable ist. Danach kannst du wie gehabt auf die Instanzen zugreifen, du musst keine Variablen neu deklarieren, sofern dein Listendurchgehen nicht in eine Funktion weggekapselt wurde. Die Instanzen werden auch nicht gelöscht werden, da sie ja noch in der Liste referenziert sind.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

M0rgenstern

BeitragMo, März 22, 2010 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, Danke für eure Hilfe.

Habs grade gelöst:

BlitzMax: [AUSKLAPPEN]
	For Local Base:TBase = EachIn TBase.AllBases

If TPlayerBase(Base) Then
Local Tmp:TPlayerBase
Tmp = TPlayerBase(Base)
Tmp.SetImage(MH)
End If

SetColor Base.iRed, Base.iGreen, Base.iBlue
DrawImage Base.tiDrawnImage, Base.iX, Base.iy

Next


Also, es funktioniert.
Ist das auch richtig gelöst?

Lg, M0rgenstern

mpmxyz

BeitragMo, März 22, 2010 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum funktioniert es dann wohl? Wink
Es ist eine richtige Lösung.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xeres

Moderator

BeitragMo, März 22, 2010 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ginge noch kürzer:
Code: [AUSKLAPPEN]
TPlayerBase(Base).SetImage(MH)
Ist aber nur kosmetischer Natur...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

das wurgel

BeitragMo, März 22, 2010 23:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Ginge noch kürzer:
Code: [AUSKLAPPEN]
TPlayerBase(Base).SetImage(MH)
Ist aber nur kosmetischer Natur...

Aber wenn es nun kein TPlayerBase-Objekt wäre, wäre das dann wie Null.SetImage(MH). Oder geht das in dem speziellen Fall?

edit: Ah sorry, jetzt habs kapiert, du meintest nur das was innerhalb des If..Endif liegt.
  • Zuletzt bearbeitet von das wurgel am Mo, März 22, 2010 23:29, insgesamt einmal bearbeitet
 

n-Halbleiter

BeitragMo, März 22, 2010 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Er spricht davon, "Tmp" direkt zu ersetzen. "Null.bla" geht meines Wissens nicht, wieso auch?
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group