OOP Frage

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

juse4pro

Betreff: OOP Frage

BeitragMo, Apr 19, 2010 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich habe folgendes Problem:

Ich habe eine Hauptklasse und eine Unterklasse dieser Hauptklasse:

BlitzMax: [AUSKLAPPEN]
Type TItemIngame
Field id
Field item:TItem 'nicht wichtig für's Problem


BlitzMax: [AUSKLAPPEN]
Type TItemIngamePlayer
Field x
Field y


jetzt will ich per Methode deklarieren, dass sich ein Objekt vom Typ TItemIngamePlayer "zurückverwandeln" soll, zum Typ: TItemIngame.
Nur würden ja dadurch 2 Fields wegfallen. Geht das ohne Probleme? Wenn ja, wie? Ich habe mir das so gedacht, aber es scheint nicht zu funktionieren:
BlitzMax: [AUSKLAPPEN]
Method GiveToPlayer:Byte()
Local l_Id:Int = Self.id
Local l_Item:TItem = Self.item
Self = New TItemIngame
Self.id = l_Id
Self.item =l_Item
Return(True)
EndMethod


Das ist eine Methode in der Klasse: TItemIngamePlayer

Hoffe ihr könnt mir auf die Sprünge helfen... Wink
Portfolio |LinkedIn |XING
 

Macintosh

BeitragMo, Apr 19, 2010 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wozu brauchst du das?

Farbfinsternis

BeitragMo, Apr 19, 2010 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Befasse Dich mal mit der Funktion "Super"
Farbfinsternis.tv

juse4pro

BeitragMo, Apr 19, 2010 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
@Macintosh: wieso willst du das wissen? Razz Eine andere Lösung für das Problem würde meinen Server aus dem Konzept werfen ^^

@Farbfinsternis: Super! Mach ich... ... ... Also mit Super greife ich auf Element zu, die in der Hauptklasse gelten...? Kann ich das nicht auch so? (Oder sie ergänzt Methoden.. aber wie soll mir das helfen? Ich steh aufm Schlauch)
Portfolio |LinkedIn |XING
 

n-Halbleiter

BeitragMo, Apr 19, 2010 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf Fields kannst du immer zugreifen, dafür brauchst du nicht "Super". Das kannst du verwenden, um explizit auf eine Methode der Mutterklasse zuzugreifen (siehe dazu mal in der Help das Beispiel für "Super).

Wenn du einen Type vererben lässt, ist es grundsätzlich so, dass die Fields übernommen werden, aber die Methoden, wenn du sie im "Kindtype" neu schreibst, überschrieben werden.
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)

juse4pro

BeitragDi, Apr 20, 2010 7:55
Antworten mit Zitat
Benutzer-Profile anzeigen
nochmal jetzte: Was ist Vererbung? Hab ich da was nicht begriffen?
Unter Vererbung verstehe ich, dass alle Fields einer Hauptklasse auch für Subklassen gelten, oder?
Portfolio |LinkedIn |XING

Jolinah

BeitragDi, Apr 20, 2010 8:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, und auch alle Methoden. Nur dass du Methoden in der Subklasse überschreiben kannst. Wenn du eine Methode überschreibst hättest du aber keinen Zugriff mehr auf die Implementation (Verhalten) der alten Methode, daher gibt es dann das "Super", damit kannst du die alte Methode aufrufen:

BlitzMax: [AUSKLAPPEN]

Type A
Method Drucken()
Print "------------------"
Print "Header"
Print "------------------"
End Method
End Type

Type B Extends A
Method Drucken()
Super.Drucken() 'Alte Methode ausführen (Header ausgeben)
Print "------------------"
Print "Footer"
Print "------------------"
End Method
End Type

Local a_instanz:A = New A
Local b_instanz:B = New B

a.Drucken() 'gibt nur den Header aus
b.Drucken() 'gibt Header und Footer aus, obwohl Header im Type B nirgends definiert wurde


Hoffe das hilft Wink

juse4pro

BeitragDi, Apr 20, 2010 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
das habe ich schon begriffen.. und das war ehrlichgesagt auch nicht meine frage... Meine Frage war:
Wie kann ich das Objekt in ein Objekt umwandeln, welches vom Typ der Hauptklasse ist (nur) und nicht von der Subklasse...
Ich denke das ist ein Fall für Polymorphie und nicht von Vererbung.. aber ich check bloß nicht ganz wie ich das "ruck"-umwandle
Portfolio |LinkedIn |XING

Firstdeathmaker

BeitragDi, Apr 20, 2010 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du mal eine Beispielsituation schildern in der das benötigt wird? Normalerweise sind alle Abgeleiteten Klassen Automatisch auch vom Typ der vererbten Klasse, du kannst also so tun als ob sie beides wären und auch entsprechend casten:


Code: [AUSKLAPPEN]

Type TGameObject
   field id:string
end Type

Type TPlayer extends TGameObject
   field name:string
end Type


local p:TPlayer = new TPlayer
local o:TGameObject = p


'Rückumwandeln
local p2:TPlayer = TPlayer(o)
'falls o kein TPlayer war, sondern etwas ganz anderes, dann ist p2 jetzt = null
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

juse4pro

BeitragDi, Apr 20, 2010 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
das brauche ich um Speicherplatz zu sparen...

wenn ein item x,y gespeichert bekommt... brauch ich die koordinaten nicht mehr, wenn der Spieler es aufgesammelt hat Wink
Portfolio |LinkedIn |XING

mpmxyz

BeitragDi, Apr 20, 2010 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Bist du sicher, dass du gerade da sparen musst?
Bei mehr als 100 Items wäre es immer noch weniger als ein KiB zusätzlicher Speicherplatz.
Umwege, die zu einer Staffelung der Größen führen, brauchen entweder zusätzlichen Speicher, doppelten Code oder zusätzlichen Code, der nur dazu da ist, Objekte als "platzsparendes" Objekt zu kopieren.
Das, was du an Datenspeicher "gewinnst", verlierst du bestimmt durch diesen Aufwand. (Programmcode braucht ja auch ein bischen Speicher.)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragDi, Apr 20, 2010 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja darauf kann ich nicht verzichten da gehen nämlich pro item 4+4+1+30 Bytes (39 Bytes) an die Katz...
Und das kann oft nach oben variieren.. Ausserdem ist hier die Rede von mehreren tausend Items...

Darauf kann ich nicht verzichten.. ist es echt nicht möglich eine Klasse zu "de"generieren?
ich meine ich kann doch aus einer klasse, eine klasse als unterklasse machen... aber nicht andersrum?
Portfolio |LinkedIn |XING

Jolinah

BeitragDi, Apr 20, 2010 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, nur so wie FDM es gezeigt hat. Aber du kannst ja einfach eine eigene Funktion schreiben:

BlitzMax: [AUSKLAPPEN]

Type Item
Field A:Int, B:Int

Function FromPosItem:Item(Pi:posItem)
Local i:Item = New Item
i.A = Pi.A
i.B = Pi.B
Return i
End Function
End Type

Type PosItem Extends Item
Field X:Int, Y:Int
End Type

Local Pi:PosItem = New PosItem
Pi.A = 5
Pi.B = 10
Pi.X = 125
Pi.Y = 400

Local i:Item = Item.FromPosItem(Pi)

mpmxyz

BeitragDi, Apr 20, 2010 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das, was du sagst, kann man nicht, wenn man es nicht selbst macht.
Das, was du umwandelst, ist die Referenz auf das Objekt, welches sich dabei kein Stück ändert.
(Eigentlich ändert sich sogar noch nicht einmal der Wert der Referenz, wenn sie "umgewandelt" werden kann. Wenn die Umwandlung nicht erfolgreich sein kann, wird nur "Null" daraus gemacht.)
Ich nehme mal an, dass du 10.000 Items hast.
->381 KiB Speicherplatz
Ist das soo viel? Nicht ganz, wenn ich davon ausgehe, dass du nicht gerade ein Spiel für ein Mobiltelefon programmierst; zumindest überlastet es keinen PC.
Wie lässt sich das optimieren?
Brauchst du ernsthaft 10.000 Items?
Jeder wäre bei dieser Fülle überfordert. (Garantiert!) Wink
->Kürzen um mindestens 90% Das macht immer noch 1000 restliche Items.
Um auch einen Vorschlag auf deine Optimierungsidee zu machen:
Was machen diese Items denn?
Haben sie alle irgendwelche zusammenfassbaren Effekte?
->Da könnte man etwas in externe Klassen auslagern und jedes Item bekommt einen solchen Effekt.
Wenn das Item aufgenommen wurde, braucht man nicht mehr das Item-Objekt, sondern nur noch das Effektobjekt.
mfG
mpmxyz
Edit: Ich bin immer noch an dem Grund für die Menge interessiert. Smile
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
  • Zuletzt bearbeitet von mpmxyz am Di, Apr 20, 2010 19:50, insgesamt einmal bearbeitet

juse4pro

BeitragDi, Apr 20, 2010 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
ich denke ich habe nun verstanden, dass ich nicht zurückumwandeln kann. Ich werde also eine Funktion einrichten, die ein neues Objekt erzeugt, die Eigenschaften übernimmt und das alte Objekt löscht...

Ok Danke für die Denkanstöße, danke leute Wink
Portfolio |LinkedIn |XING

Alfadur

BeitragMi, Apr 21, 2010 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Also was mir auffällt ist, dass du deine zweite Klasse garnicht von der ersten ableitest...da fehlt ein "extends". In den Beispielen der anderen ists richtig gemacht...
Also hast du im Moment garkeine Klassenhierarchie, sondern einfach nur 2 (unabhängige) Klassen.
Falls du dieses "extends" nur vergessen hast, dann .... ansonsten solltest du dir nochmal was zu Vererbung durchlesen.
A Cray is the only computer that runs an endless loop in less than four hours.

juse4pro

BeitragMi, Apr 21, 2010 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja in meinem Code steht das schon da.. ich hab bloß nicht kopiert sondern abgetippt (selber schuld Rolling Eyes )
warum? Vererbung hab ich begriffen und ich hab das Problem jetzt auch gelöst ^^

Danke für die Hilfe... Wink
Portfolio |LinkedIn |XING

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group