BMax und Super

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

rambo256

Betreff: BMax und Super

BeitragMo, Jul 26, 2010 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich wollte gerade in alter java/c++ Manier folgendes tun:
Ich habe eine Basis Klasse, sein Konstruktoraufruf hat ein paar Parameter, also überlade den Standard "Konstruktor" aka die Create Funktion.
Nun habe ich die abgeleitete Klasse X. In dieser Klasse X, möchte ich nun den Standard "Konstruktor" mit den Parametern aufrufen, die erwartet werden. Also PseudoCode mäßig so etwas:

BlitzMax: [AUSKLAPPEN]
Type Base 

Field x, y

Function Create:Base(x,y)
Local temp:Base = New Base
temp.x = x
temp.y = y
Return temp
EndFunction

End Type

Type X Extends Base

Field z

Function Create:X(x,y)
Local temp:X = New X
temp = X(Super.Create(x,y))
temp.y = Rnd(0,1000)
Return temp
EndFunction

End Type


Diese Zeile
BlitzMax: [AUSKLAPPEN]
temp = X(Super.Create(x,y))

macht für mich Sinn, da ja die Create Funktion auch ein Objekt vom Typ X zurückgeben soll.
Was ich da versuche ist folgendes in java (nehmen wir dabei an, ich hätte zuvor die Basis Klasse schon geschrieben):
BlitzMax: [AUSKLAPPEN]

Public class X Extends Base

Private Int z;

Public X(Int x, Int y)
{
Super(x,y)
this.z = 1337;
}

}


Ich möchte also das abgeleitete Objekt, mit Hilfe dem von der Basis Klasse zur Verfügung gestellten Konstruktor, "initialisieren". Geht dies Grundsätzlich nicht, da BMax diese Eigenschaft des OOPs nicht beherrscht, oder gibt es einen "Workaround"?

Ich hoffe es gibt einen solchen, da dies nämlich eine Menge Code ersparen kann.
Asus F53z

Das Leben ist eine reine Konkatenation...

Xeres

Moderator

BeitragMo, Jul 26, 2010 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Benutze SuperStrict
2. Kann sein das ich dich missverstehe, aber X kannst du nach Base casten, oder auch so auf die Felder x und y zugreifen... drum weiß ich nicht genau, was du erreichen willst.

Nachtrag:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Type TBase

Field x:Int, y:Int

Method New()
Print("NEW TBase")
End Method

Function Create:TBase(x:Int, y:Int)
Print("Create TBase")
Local temp:TBase = New TBase
temp.x = x
temp.y = y
Return temp
EndFunction

End Type

Type Tex Extends TBase

Field z:Int

Method New()
Print("NEW Tex")
End Method

Function Create:Tex(x:Int, y:Int)
Print("Create Tex")
Local temp:Tex = New Tex
temp.x = x
temp.y = y
temp.z = Rnd(0, 1000)
Return temp
EndFunction

End Type

Local Test:Tex = Tex.Create(3, 6)
Print "x: " + Test.x
Print "y: " + Test.y
Print "z: " + Test.z
Print "---"

Local Test2:TBase = TBase(Test)
Print "x: " + Test2.x
Print "y: " + Test2.y
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

rambo256

BeitragMo, Jul 26, 2010 2:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin, jap du verstehst mich falsch Wink

Ich möchte einfach redundanten Code vermeiden!
Und zwar hast du in beiden Create Funktionen halt wieder diese beiden Zeilen drin:


BlitzMax: [AUSKLAPPEN]
temp.x = x
temp.y = y


D.h. ich möchte durch den Aufruf des "Konstruktors" der Basis Klasse dies vermeiden, da ja schon dort beschrieben steht, wie diese beiden Variablen zu initialisieren sind.
Asus F53z

Das Leben ist eine reine Konkatenation...
 

n-Halbleiter

BeitragMo, Jul 26, 2010 3:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das, was du dir vorstellst, geht nicht. Aber das macht nichts, es gibt einen einfachen Workaround (der, denke ich, sogar noch anderweitig nützlich ist, da BMax keine Funktionsüberladung unterstützt, nur Funktionsüberschreibung). Die Idee: Nutze einen Konstruktor (z.B. "Create") und eine Methode, mit der du das Objekt Initialisierst (z.B. "Init").

Beispielcode (deiner adaptiert und modifiziert):BlitzMax: [AUSKLAPPEN]
SuperStrict

Type TBase

Field x:Int,y:Int

Function Create:TBase(x:Int,y:Int)
Local Base:TBase=New TBase
Base.TBaseInit(x,y)
Return Base
EndFunction

Method TBaseInit(x:Int,y:Int)
Self.x=x
Self.y=y
End Method

End Type

Type TX Extends TBase

Field z:Int

Function Create:TX(x:Int,y:Int)
Local XY:TX=New TX
XY.TBaseInit(x,y)
XY.TXInit(Rnd(0,1000))
Return XY
EndFunction

Method TXInit(z:Int)
Self.z=z
End Method

End Type

Local BaseObj:TBase=TBase.Create(10,15)
Print "BaseObj:"
Print "x="+BaseObj.x
Print "y="+BaseObj.y
Print ""

Local XObj:TX=TX.Create(20,25)
Print "BaseObj:"
Print "x="+XObj.x
Print "y="+XObj.y
Print "z="+XObj.z
Print ""


Ich hoffe, das hilft dir weiter. Es ist vielleicht etwas sperrig, kann aber schon manchmal helfen, beispielsweise, wenn man Instanzen neu Initialisieren will/muss (weil zum Beispiel viele - u.U. nicht nachverfolgbare - Referenzen auf die Instanz zeigen).

EDIT:
Kurzer Hinweis: Du musst wegen der Funktionsüberladung (vielmehr wegen nicht verfügbarer Funktionsüberladung) die "Create"-Funktionen bei Veränderungen der Parameter/Rückgabewerte ja auch anders benennen. Dabei hilft ein einheitliches Schema, beispielsweise "CreateBase" und "InitBase" bzw. "CreateXY" bzw. "InitXY". Nur bei dem Type, der später wirklich häufig gebraucht wird, ist die Funktion "Create" (aufgrund von Faulheit) tragbar. Oder am Ende der Vererbungskette bei (kurzen) Ketten. Denkbar wäre eine Vererbungskette von "TnTupel" über "T2Tupel" zu "T2IntVector" oder ähnliches. Dann nur für den Type "T2IntVector" die "Create" Funktion definieren, bzw. dann evtl. auch für "T2FloatVector". Wink
  • Zuletzt bearbeitet von n-Halbleiter am Mo, Jul 26, 2010 3:45, insgesamt einmal bearbeitet

rambo256

BeitragMo, Jul 26, 2010 3:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Perfekt! Besten Dank für diese Idee Smile
Werde das dann mal gleich nach dem verdienten Schlaf einbauen.
Asus F53z

Das Leben ist eine reine Konkatenation...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group