OOP Frage
Übersicht

![]() |
juse4proBetreff: OOP Frage |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, ich habe folgendes Problem:
Ich habe eine Hauptklasse und eine Unterklasse dieser Hauptklasse: BlitzMax: [AUSKLAPPEN] Type TItemIngame BlitzMax: [AUSKLAPPEN] Type TItemIngamePlayer 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() Das ist eine Methode in der Klasse: TItemIngamePlayer Hoffe ihr könnt mir auf die Sprünge helfen... ![]() |
||
Portfolio |LinkedIn |XING |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wozu brauchst du das? | ||
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Befasse Dich mal mit der Funktion "Super" | ||
Farbfinsternis.tv |
![]() |
juse4pro |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Macintosh: wieso willst du das wissen? ![]() @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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]
Hoffe das hilft ![]() |
||
![]() |
juse4pro |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Portfolio |LinkedIn |XING |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, nur so wie FDM es gezeigt hat. Aber du kannst ja einfach eine eigene Funktion schreiben:
BlitzMax: [AUSKLAPPEN]
|
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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!) ![]() ->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. ![]() |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
- Zuletzt bearbeitet von mpmxyz am Di, Apr 20, 2010 19:50, insgesamt einmal bearbeitet
![]() |
juse4pro |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Portfolio |LinkedIn |XING |
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja in meinem Code steht das schon da.. ich hab bloß nicht kopiert sondern abgetippt (selber schuld ![]() warum? Vererbung hab ich begriffen und ich hab das Problem jetzt auch gelöst ^^ Danke für die Hilfe... ![]() |
||
Portfolio |LinkedIn |XING |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group