Elternklasse und Fields der Kindklasse

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Farbfinsternis

Betreff: Elternklasse und Fields der Kindklasse

BeitragFr, Apr 03, 2009 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht kann mir ja hier jemand einen Tipp geben wie ich ne Menge Arbeit sparen kann.

Folgendes: Ich habe ein Konstrukt welches ich vereinfacht mal hier darstelle:
Code: [AUSKLAPPEN]

Type TEltern
  Field node:TObjekt1

  Method SetX(x:Float)
    Self.node.SetX(x)
  End Method
End Type

Type TKind Extends TEltern
  Field node:TObjekt2

  Function Create:TKind()
    Local kind:TKind = New TKind
    kind.node = New TObjekt2
   
    Return kind
  End Function
End Type

Local myKind:TKind = TKind.Create()
myKind.SetX(10.0)


Wie man sieht überschreibe ich in der Kindklasse das Field "Node" und verpasse ihm einen anderen Typ, das geht, kein Problem.
Wenn ich nun aber die Methode "SetX" aufrufe ist "node = NULL" obwohl das Objekt in der Kindklasse erstellt wurde.
Gibt es irgendeine Möglichkeit BMax beizubiegen dass die Methode der Elternklasse die Daten der Kindklasse anwendet?
Farbfinsternis.tv
 

ChristianK

BeitragFr, Apr 03, 2009 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Farbfinsternis hat Folgendes geschrieben:
Wie man sieht überschreibe ich in der Kindklasse das Field "Node" und verpasse ihm einen anderen Typ, das geht, kein Problem.

Doch, leider liegt genau da das Problem. Wenn zwei Felder den gleichen Namen haben, werden sie nicht überschrieben, sondern befinden sich einfach in einem anderen Scope. Das Problem bei deinem Beispiel ist, dass TEltern.node nie mit einem Wert gefüllt wird, also immer Null bleibt, was man bei dem Versuch, SetX aufzurufen, dann auch bemerkt. Nur das Feld TKind.node wurde mit einem Wert gefüllt. Insgesamt hat das also den gleichen Effekt, als würdest du TKind.node einen anderen Namen geben.
Für solche Geschichten wäre Super ganz hilfreich, nur leider funktioniert das in BlitzMax nur mit Methoden, nicht mit Variablen. An diesem Beispiel wird das Problem vielleicht etwas deutlicher:

Code: [AUSKLAPPEN]
Type A
   Field x:Int = 5
End Type

Type B Extends A
   Field x:Int = 10
   
   Method Out()
      Print x ' Mit "Print Super.x" könnte man den x-Wert aus dem Type A ausgeben lassen.
   End Method
End Type

Local t:B = New B
t.Out() ' Ausgabe ist 10.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Farbfinsternis

BeitragFr, Apr 03, 2009 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die vernichtende Antwort. Demzufolge bleibt mir nichts anderes übrig als alle betroffenen Methoden der Elternklasse nocheinmal in der Kindklasse zu definieren.
Farbfinsternis.tv

Holzchopf

Meisterpacker

BeitragFr, Apr 03, 2009 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
(... nachdem sich Farbfinsternis im Chat ja leider verabschiedet hat)

Gibts denn vom ganzen Irrlicht-Node-Zeugs keine Ur-Klasse? Wie INode oder so?

Sonst könntest du es analog dem machen:
Code: [AUSKLAPPEN]

SuperStrict

Type iDings
   Method Move()
   End Method
End Type
Type iMesh Extends iDings
   Method Move()
      Print "Mesh moved!"
   End Method
End Type
Type iMeshAnim Extends iDings
   Method Move()
      Print "AnimMesh moved!"
   End Method
End Type

Type TEntity
   Field node:Object
   
   Method Move()
      iDings(Self.node).Move()
   End Method
End Type

Type TMesh Extends TEntity
   Function Create:TMesh()
      Local Mesh:TMesh = New TMesh
      Mesh.node = New iMesh
      Return Mesh
   End Function
End Type

Type TMeshAnim Extends TEntity
   Function Create:TMeshAnim()
      Local MeshAnim:TMeshAnim = New TMeshAnim
      MeshAnim.node = New iMeshAnim
      Return MeshAnim
   End Function
End Type

Function Move( pObject:Object )
   TEntity( pObject ).Move()
End Function

Local test:TMesh = TMesh.Create()
Local test2:TMeshAnim = TMeshAnim.Create()
test.Move()
test2.Move()

Move( test )


(iDings wär hier dieser Ur-Type)

Der Cast iDings(Self.node).Move() funktioniert erstaunlicherweise (beachte: node wird als :Object deklariert)... Gut, so erstaunlich wärs ja eigentlich nicht, aber bei BMax... Wie dem auch sei, obwohl das Objekt nach iDings (Elternklasse) gecastet wird, wird die Methode der richtigen Kindklasse (halt eben iMesh oder iMeshAnim) aufgerufen.
Ich hoffe behilflich gewesen zu sein Wink

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

amon

BeitragFr, Apr 03, 2009 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
IMHO würds funktionieren wenn TObjekt1 und TObjekt2 vom gleichen "Objektstammbaum" sind, also beide vom gleichen Type erben würden, oder 1 von 2 oder vice versa.

[edit] sorry, ich hätte holzis beitrag genauer lesen sollen, steht ja die gleiche aussage dahinter Smile

Jolinah

BeitragFr, Apr 03, 2009 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ansonsten kann man noch mit Reflection was machen:

Code: [AUSKLAPPEN]
SuperStrict

'Unabhängiger Type 1
Type TObjekt1
   Field X:Float
End Type

'Unabhängiger Type 2
Type TObjekt2
   Field X:Float
End Type


Type TEltern
   Field node:Object
   
   Method SetX(x:Float)
      Local t:TTypeId = TTypeId.ForObject(node)
      Local f:TField = t.FindField("X")

      If f <> Null Then
         If f.TypeId().Name() = "Float" Then
            f.SetFloat(node, x)
         EndIf
      EndIf
   End Method
End Type

Type TKind Extends TEltern
   Function Create:TKind()
      Local kind:TKind = New TKind
      kind.node = New TObjekt2
      
      Return kind
   End Function
End Type

Local myKind:TKind = TKind.Create()
myKind.SetX(10)

Local obj:TObjekt2 = TObjekt2(myKind.node)
Print obj.x

End


Das ist jetzt direkt mit Fields... mit Methoden klappts leider nicht wenn die Argumente keine Objekte sind, da TMethod.Invoke ein Object-Array erwartet und sich ein Float z.B. nicht in ein Object konvertieren lässt. Fänds sowieso cool wenn gewöhnliche Zahlentypen auch Objekte wären, selbst wenn das ein kleiner Overhead ist Rolling Eyes

Farbfinsternis

BeitragSo, Apr 05, 2009 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe es anders gelöst:

Alle Irrlicht-Nodes werden zunächst als Basis Objekt "iSceneNode" gesichert. Sollen dann Aktionen mit dieser Node durchgeführt werden die iSceneNode nicht kennt, caste ich vorher einfach die Node auf den dafür notwendigen Typ.

Trotzdem Danke für Eure Tipps und Hinweise!
Farbfinsternis.tv

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group