[Klassen] Zugriff auf übergeordnete möglich?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Skulk

Betreff: [Klassen] Zugriff auf übergeordnete möglich?

BeitragFr, Jul 07, 2006 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey zusammen,

nachdem SucoX mir bei dem Klassen-Verschachteln so super geholfen hat, hab ich eine weitere Frage.

Gehen wir von Folgender Situation aus:
(bitte nicht auf syntax achten, ich schreibe aus gedächtnis. syntax ist jetzt auch noch net so wild, hauptsache ihr versteht was ich meine
Code: [AUSKLAPPEN]

Type tMerkmale
   Field fLieblingsessen
   Field fHautfarbe
   ...
End Type

Type tKI
   method EntscheideWasDuEssenWillst()
End Type

Type tObjekt
   field Merkmal:tMerkmale
   field Kopf:tKI

   method new()
      Self.Position = new tPosition
      Self.Kopf = new tKI
   end method
End Type


soweit so gut. was wäre wenn ich jetzt in tObjekt.Kopf.EntscheideWasDuEssenWillst() auf die Variable tObjekt.Merkmal.Lieblingsessen zugreifen will?

ist das möglich? eigentlich dürfte ja die (ich nenns etz mal so, ich weiss der begriff hat eine andre bedeutung) SubKlasse tKI nicht von der Existenz von tMerkmale wissen.


danke für eure (zahlreiche) hilfe Smile
War doesn't determine who's right,
war determines who's left...

d-bug

BeitragFr, Jul 07, 2006 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Über Extend:
Code: [AUSKLAPPEN]

Type tObjekt
   field Merkmal:tMerkmale
   field Kopf:tKI

   method new()
      Self.Position = new tPosition
      Self.Kopf = new tKI
   end method

   method EntscheideWasDuEssenWillst() ; end method

End Type

Type tKI Extends tObject
   method EntscheideWasDuEssenWillst()
        local blub = super.merkmal.fLieblingsessen
   end method
End Type



Oder direkt :
Code: [AUSKLAPPEN]
blub = .tMerkmale.fLieblingsessen

wobei fLieblinsessen dann aber eine global Variable sein müßte
und für alle Köpfe gleich wäre.
  • Zuletzt bearbeitet von d-bug am Fr, Jul 07, 2006 14:30, insgesamt einmal bearbeitet

Rone

BeitragFr, Jul 07, 2006 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
so vieleicht:
Code: [AUSKLAPPEN]

Type tKI
   method EntscheideWasDuEssenWillst(  Merkmal:tMerkmale  )
End Type


oder so:
Code: [AUSKLAPPEN]

Type tMerkmale
   Field fLieblingsessen
   Field fHautfarbe
   ...
End Type

Type tKI Extends tMerkmal
   method EntscheideWasDuEssenWillst()
End Type

Type tObjekt
   field Kopf:tKI

   method new()
      Self.Position = new tPosition
      Self.Kopf = new tKI
   end method
End Type


mfg
Rone
 

Skulk

BeitragFr, Jul 07, 2006 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
nein das hilft mir nicht weiter...

was ich erreichen will ist eine art gruppierung. ich missbrauche das klassensystem um ähnliche werte zu gruppieren.
z.b.

Objekt.Position.X
Objekt.Position.Y
Objekt.Bewegung.MoveRandom
Objekt.Bewegung.MoveDirectToPoint
Objekt.Bewegung.RunFaster
Objekt.KI.DecideIfYouWannaFollowALeader
Objekt.KI.DecideIfYouWannaFindFood
Objekt.Merkmale.Geschwindigkeit
Objekt.Merkmale.Hautfarbe

etc.

mir geht es nicht darum ein grund objekt zu schaffen (Tier) und weitere Objekte (Ratte, Hund) davon zu bilden
Also NICHT
Tier
Tier.Hund
Tier.Hund.Dogge
Tier.Hund.Schäferhund
Tier.Ratte
Tier.Ratte.BlackHooded
Tier.Ratte.Husky

etc.


dass erst dort das objektorientierte programmieren seine vorzüge ausspielt ist mir klar.
War doesn't determine who's right,
war determines who's left...

Jolinah

BeitragFr, Jul 07, 2006 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht so nicht, dann müsstest du in jedem Objekt eine Referenz auf das Hauptobjekt haben.
 

Skulk

BeitragFr, Jul 07, 2006 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm verdammt ich hab sowas befürchtet....
mist dann muss ich mir was neues, übersichtliches einfallen lassen

trotzdem danke für eure hilfe!
War doesn't determine who's right,
war determines who's left...
 

Dreamora

BeitragSa, Jul 08, 2006 8:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum?
So schwer bei den Merkmalen ein Field parent:TObjekt einzufügen, damit du rauf und runter springen kannst in der Struktur? (du musst dann einfach eine zerstörungsfunktion schreiben, weil sonst weder das TObjekt noch die Merkmale je aufgeräumt werden können!)

Auf der anderen Seite: Die Merkmale müssen doch eigentlich eh nicht auf einander zugreifen oder?
Andere Objekte werden, wenns sauber design ist, nur auf das TObjekt eine Referenz halten und die für sie notwendigen abfragen
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Suco-X

BeitragSa, Jul 08, 2006 9:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso kann man in der OOP eigentlich nur vorwärts und nicht rückwärts? Smile
Nicht dass ich es jemals gebraucht hätte, aber bin schon etwas neugierig.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

Dreamora

BeitragSa, Jul 08, 2006 9:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum, du kannst in beide Richtungen?
Du musst einfach bei beiden eine Referenz einrichten.

In einem managed System ist es einfach nicht sonderlich geschickt wegen dem Garbage Collecting.
Java löst das über Reflection Mechanismen, wenn ich mich richtig erinner ... ob C# sowas hat, weiss ich nicht.
Eiffel hats ziemlich sicher nicht, weils nicht auf gutes Objektdesign schliessen lässt, wenn diese Richtung notwendig ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Suco-X

BeitragSa, Jul 08, 2006 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich meine ohne eine Referenz anzulegen. Hat man ein Objekt, geht man ja eigentlich von Oben nach unten (Alien->Aussehen->Farbe). Wieso sollte man diesen Weg nicht ohne Extrareferenz zurückgehen können?
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

Skulk

BeitragSa, Jul 08, 2006 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
wie lege ich eine referenz an?
wenn ich das über Klass = New tKlasse mache, erzeuge ich doch eine neue instanz oder nicht?
War doesn't determine who's right,
war determines who's left...

Jolinah

BeitragSa, Jul 08, 2006 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil Aussehen eine Eigenschaft des Aliens ist. Alien ist aber keine Eigenschaft von Aussehen. Anders gesagt, Aussehen ist eigentlich unabhängig vom Alien. Du könntest ein Aussehen Objekt evtl. auch einem Haus zuteilen. Und da Objekte im Speicher sowieso keine bestimmte Anordnung haben, wie sollte man da ohne Referenz wissen, welches Parent ein Objekt hat. Hinzu kommt, dass das genau gleiche Aussehen Objekt mehrere Parents haben könnte.

Erst durch Referenzen wird ja so eine verschachtelte Hierarchie erstellt, wenn man rückwärts gehen will, muss man es halt wieder mit Referenzen machen, da es kein eindeutiges Parent-Objekt gibt.

@Skulk:
Das stimmt, aber die Variable, die auf diese neu erstellte Instanz zeigt, ist eine Referenz. Das Objekt selbst ist die Instanz.
 

Skulk

BeitragSa, Jul 08, 2006 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist schon klar wieso dass (eigentlich) nicht nötig sein sollte...und es macht ja auch keinen sinn...

aber da ich IT als beruf hab, weiss ich, dass dies keine gründe sein müssen und das es dennoch implementiert sein könnte *g*
War doesn't determine who's right,
war determines who's left...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group