[GELÖST] Import-Kreuzbeziehungen?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] Import-Kreuzbeziehungen?

BeitragDi, Jan 17, 2017 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich schon wieder Very Happy

Ich stehe aktuell vor dem Problem, dass ich eine Kreuzbeziehung zwischen zwei Klassen in zwei Dateien habe. Meine Struktur sieht in etwa wie folgt aus:
Type TA (Datei "a.bmx")-BlitzMax: [AUSKLAPPEN]
Type TA
Field bs:TList ' List of TBs

Function Create:TA()
Local RetVal:TA = New TA
RetVal.bs = CreateList()
Return RetVal
End Function

Method AddB(b:TB)
If (b <> Null)
b.SetParent(Self)
ListAddLast(Self.bs, b)
End If
End Method
End Type


Type TB (Datei "b.bmx")-BlitzMax: [AUSKLAPPEN]
Type TB
Field parent:TA

Function Create:TB()
Local RetVal:TB = New TB
RetVal.parent = Null
Return RetVal
End Function

Method SetParent(a:TA)
Self.parent = a
End Method
End Type


Importiere ich die Dateien untereinander, entsteht eine Kreuzbeziehung, die der Compiler nicht auflösen kann. Includeiere ich einer der beiden Dateien in der anderen funktioniert es prächtig. Bei der zweiten Möglichkeit habe ich jedoch das Problem, dass die Teilklassen (im obigen Falle TA und TB) jeweils noch weitere Sachen importieren, die auch an anderen Stellen benötigt werden (der Aufwand wäre zu groß, für jeden dieser Imports zu ermitteln, wo er zuerst benötigt wird und dort ein Include zu machen)

Meine Frage ist nun: Kann ich dieses Problem ohne die Nutzung von Include lösen? Oder ist das eine Eigenheit des BlitzMax-Compilers?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Di, Jan 17, 2017 21:35, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragDi, Jan 17, 2017 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Regel weisen solche Kreisreferenzen auf Fehler im Codedesign hin, da hakt es mit der sauberen Kapselung.
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
 

CO2

ehemals "SirMO"

BeitragDi, Jan 17, 2017 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, also nur mit Import ist keine Lösung zu finden?

Edit: Grundsätzlich wäre eine Lösung mit Include kein Problem, dann würde ich halt einfach die eine Datei bei der anderen Includen. Dann ist aber das Problem, dass meine Imports in der includeten Datei nicht mehr kompilierbar sind, da "sie am Anfang der Datei stehen müssen"...

Edit 2: Es hat sich gerade erledigt. Hier nochmal die Problemlösung in Pseudo-Code (hat nichts mit dem Beispiel im ersten Post zu tun)
Datei "abschild.bmx" BlitzMax: [AUSKLAPPEN]
Type TAbsChild Abstract
Field Parent:TAbsParent

Method InitChild(parent:TAbsParent)
Self.Parent = Parent
End Method

' Hier gibt es natürlich weitere Methoden, die den Parent bräuchten.

Method RegisterObject(id:String, data:Object) Abstract
End Type


Datei "absparent.bmx" BlitzMax: [AUSKLAPPEN]
Include "abschild.bmx"

Type TAbsParent Abstract
Field Childs:TMap

Method Init()
Self.Childs = CreateMap()
Self.RegisterChilds()
End Method

Method ParseFile(file:String)
' Zeilenweise auslesen
' Jede Zeile ist ein Datensatz und hat eine Typ-ID
' Je nach Typ-ID muss ein anderes Child angesprochen werden, was den Datensatz weiterverarbeitet

' Über TAbsParent.GetChild() und der o.g. Typ-ID wird das entsprechende konkrete Child angesprochen
' Mit dem Child wird dann Child.ParseData() mit dem ausgelesenen Datensatz ausgeführt.
End Method

Method RegisterChild(typeid:Int, child:TAbsChild)
MapInsert(Self.Childs, typeid + "", child)
End Method

Method GetChild:TAbsChild(typeid:Int)
Return TAbsChild(MapValueForKey(Self.Childs, typeid + ""))
End Method

Method RegisterChilds() Abstract
End Type


Datei "child1.bmx" BlitzMax: [AUSKLAPPEN]
Import "absparent.bmx"

Type TChild1 Extends TAbsChild
Function Create:TChild1(parent:TAbsParent)
Local RetVal:TChild1 = New TChild1
RetVal.InitChild(parent)
Return RetVal
End Function

Method ParseData(data:String[])
' Mache irgendwas, zum Beispiel: Nutze andere Klassen (schlechtes Beispiel, so ist es aber), wofür es weitere Imports am Anfang der Datei gibt.
End Method
End Type


Datei "parent.bmx" BlitzMax: [AUSKLAPPEN]
Import "absparent.bmx"

Import "child1.bmx"
Import "child2.bmx" ' (gibt keinen Beispielcode :D)

Type TParent Extends TAbsParent
Function Create:TParent()
Local RetVal:TParent = New TParent
RetVal.InitParent()
Return RetVal
End Function

Method RegisterChilds()
Super.RegisterChild(1, TChild1.Create(Self))
Super.RegisterChild(2, TChidl2.Create(Self))
End Method
End Type


Und nun würde an einer anderen Stelle im Code einfach eine Variable vom Typ TParent erzeugt, mit der z.B. eine Datei geparsed werden kann.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group