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

![]() |
M0rgensternBetreff: Vererbte Klassen in einer Liste -> Bestimmte Funktion wäh |
![]() Antworten mit Zitat ![]() |
---|---|---|
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() 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 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Im Code ist schon die Lösung gegeben:
BlitzMax: [AUSKLAPPEN] If Auto(f) 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 In der schleife wird dann ja auch auf a, b zugegirffen: BlitzMax: [AUSKLAPPEN] If Auto(f) 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, Danke für eure Hilfe.
Habs grade gelöst: BlitzMax: [AUSKLAPPEN] For Local Base:TBase = EachIn TBase.AllBases Also, es funktioniert. Ist das auch richtig gelöst? Lg, M0rgenstern |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum funktioniert es dann wohl? ![]() Es ist eine richtige Lösung. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group