Hi all,
I have a two base classes that need to refer to each other in their interface: TMachine and TWidget. TMachine maintains (amongst lots of other properties) a list of TWidget objects, and each TWidget descendent has methods that make a slew of modifications to the properties in it's owning TMachine object. There are hundreds of TMachine descendent classes, and hundreds of TWidget descendent classes.
How should I best structure this?
I initially went about putting all of the TMachine classes into unit uMachine, and all the TWidget classes into unit uWidget, but that creates a circular unit reference. Each Machine has to know about it's widgets, and each widget needs to know about it's owning machine.
The easy fix would be to combine TMachine and TWidget into one massive unit that would end up being around 20,000 lines of code. I would prefer not.
Another easy fix would be to use typecasting, so that each TWidget only knows that it's owner is a TObject, and not a TMachine. Because the typecasting is all handled in the implementation section, there's no circular unit reference. This is what I'm leaning towards, but again, I would prefer not.
What other options are there that I haven't thought of?
I have a two base classes that need to refer to each other in their interface: TMachine and TWidget. TMachine maintains (amongst lots of other properties) a list of TWidget objects, and each TWidget descendent has methods that make a slew of modifications to the properties in it's owning TMachine object. There are hundreds of TMachine descendent classes, and hundreds of TWidget descendent classes.
Code:
[b]unit[/b] uMachine;
[b]interface[/b]
[b]uses[/b]
uWidget;
[b]type[/b]
TMachine = [b]class[/b]
[b]private[/b]
FWidgets: TWidgetList;
[b]public[/b]
[navy][i]// ... snip lots of properties ...
[/i][/navy] [b]property[/b] Widgets: TWidgetList [b]read[/b] FWidgets;
[b]end[/b];
Code:
[b]unit[/b] uWidget;
[b]interface[/b]
[b]uses[/b]
uMachine;
[b]type[/b]
TWidget = [b]class[/b]
[b]private[/b]
FOwner: TMachine;
[b]public[/b]
[navy][i]// ... snip lots of abstract methods ...
[/i][/navy] [b]property[/b] Owner: TMachine [b]read[/b] FOwner;
[b]end[/b];
How should I best structure this?
I initially went about putting all of the TMachine classes into unit uMachine, and all the TWidget classes into unit uWidget, but that creates a circular unit reference. Each Machine has to know about it's widgets, and each widget needs to know about it's owning machine.
The easy fix would be to combine TMachine and TWidget into one massive unit that would end up being around 20,000 lines of code. I would prefer not.
Another easy fix would be to use typecasting, so that each TWidget only knows that it's owner is a TObject, and not a TMachine. Because the typecasting is all handled in the implementation section, there's no circular unit reference. This is what I'm leaning towards, but again, I would prefer not.
What other options are there that I haven't thought of?