Types verschachteln

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Tritium

Betreff: Types verschachteln

BeitragDo, März 31, 2011 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab hierzu leider noch nichts gefunden, mein Problem also:

Code: [AUSKLAPPEN]
Type a
 Type b
 End Type
End Type


...funktioniert bei mir nicht, ich bekomme einen Syntaxfehler. Ist eine derartige Verschachtelung in BMax überhaupt möglich? Wenn ja, wie bekomme ich sie hin?
Bisher umgehe ich das Problem damit, dass ich Type b "normal" definiere und Private setze. Wenn Type b aber nur von Type a benutzt werden soll ist das meines Erachtens nicht die optimale Lösung. Wär also nett, wenn jemand ne Antwort auf meine Frage hat Very Happy

Mr.Hyde

Newsposter

BeitragDo, März 31, 2011 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Vermutlich ist
BlitzMax: [AUSKLAPPEN]
Extends


das was du suchst.

Beispielcode aus der Doku:
BlitzMax: [AUSKLAPPEN]
Rem
Extends is used in a BlitzMax Type declaration to derive the Type from a specified base class.
End Rem


Type TShape
Field xpos,ypos
Method Draw() Abstract
End Type

Type TCircle Extends TShape
Field radius

Function Create:TCircle(x,y,r)
Local c:TCircle=New TCircle
c.xpos=x;c.ypos=y;c.radius=r
Return c
End Function

Method Draw()
DrawOval xpos,ypos,radius,radius
End Method
End Type

Type TRect Extends TShape
Field width,height

Function Create:TRect(x,y,w,h)
Local r:TRect=New TRect
r.xpos=x;r.ypos=y;r.width=w;r.height=h
Return r
End Function

Method Draw()
DrawRect xpos,ypos,width,height
End Method
End Type

Local shapelist:TShape[4]
Local shape:TShape

shapelist[0]=TCircle.Create(200,50,50)
shapelist[1]=TRect.Create(300,50,40,40)
shapelist[2]=TCircle.Create(400,50,50)
shapelist[3]=TRect.Create(200,180,250,20)

Graphics 640,480
While Not KeyHit(KEY_ESCAPE)
Cls
For shape=EachIn shapelist
shape.draw
Next
Flip
Wend
End
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen

FireballFlame

BeitragDo, März 31, 2011 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@Hyde: Ich glaube, er meint das, was er schreibt. Extends ist was anderes und hat ganz andere Anwendungsfälle.
@Tritium: Geht leider nicht. Was seltsam ist, da BMax Funktionen in Funktionen oder Types in Methoden durchaus unterstützt. Allerdings habe ich festgestellt, dass diese manchmal zu seltsamen Fehlern führen, also lass es lieber. Wink
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

Tritium

BeitragDo, März 31, 2011 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@Mr.Hyde: Das ist es leider nicht, Type b soll ja nicht von Type a erben. Vielleicht mal ein Beispiel:

BlitzMax: [AUSKLAPPEN]
Type TPerson
Field vorname$
Field nachname$
Field alter
Field freunde:TList
Field wohnort:TWohnort
End Type

Private Type TWohnort
Field land$
Field stadt$
Field strasse$
Field hausnummer
End Type


Mit verschachtelten Types könnte ich das so schreiben:

BlitzMax: [AUSKLAPPEN]
Type TPerson
Field vorname$
Field nachname$
Field alter
Field freunde:TList
Field wohnort:TWohnort

Type TWohnort
Field land$
Field stadt$
Field strasse$
Field hausnummer
End Type
End Type


Ein besseres Beipiel fällt mir leider grad nicht ein...

Im konkreten Fall habe ich eine Spielkarte, die aus einem (Informatik-)Graphen besteht. Jeder Knoten soll zur Wegfindung ein Objekt TDijkstra besitzen. Da diese Klasse nur in den Knoten gebraucht wird wäre es am besten, wenn auch nur der Knoten von der Existenz einer solchen Klasse weiß.
Das Problem ist eigentlich eher kosmetischer Natur, aber der Sinn hinter Objektorientierung ist ja u.a., dass auch immer nur das sichtbar ist, was ich auch brauche.


[Edit]

@FireballFlame: Mh, das ist schade. Naja, danke für die Antwort Very Happy

BladeRunner

Moderator

BeitragDo, März 31, 2011 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst doch in type a eine instanz von type b als field hinterlegen, dass ist doch das was Du suchst.
Edit: und den type kannst du als private deklarieren.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

FireballFlame

BeitragDo, März 31, 2011 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das würde man ja sowieso machen. Es ist einfach eine Frage der Sauberkeit.
Man könnte ja z.B. auch aus allen Klassen alle Functions herausnehmen und stattdessen global deklarieren; aber wenn man sie mit in die Klassen packt, sieht man sofort, dass sie zu ihnen dazugehören und kann sie als "Klasse.Funktion()" aufrufen. So würde man es mit Klassen in Klassen auch machen, wenn BlitzMax es denn beherrschen würde.
Nützlich für sowas wie das TWohnort-Beispiel von Tritium, oder Factory Pattern oder so.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group