Elternklasse und Fields der Kindklasse
Übersicht

![]() |
FarbfinsternisBetreff: Elternklasse und Fields der Kindklasse |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
(... 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 ![]() mfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
amon |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group