[Delphi] Circular Unit Reference probleem

Pagina: 1
Acties:

  • brokenp
  • Registratie: December 2001
  • Laatst online: 12:22
Ik loop tegen het volgende Circular Unit reference probleem aan in Delphi, en zie niet echt een mooie oplossing


Situatie:
Er zijn 3 klassen die elk een eigen unit hebben level, network en levelconfig.
Bij de creatie van een level krijgt hij een levelconfig mee.
levelconfig bestaat uit een aantal velden oa: NrPlayers,filename, Network:Tnetwork
Hierin staat welk level gespeeld wordt, en hoeveel spelers etc.
Er staat ook een Network component in, want het level moet data kunnen versturen naar het Netwerkcomponent.
In TLevel wordt deze gehele klasse opgeslagen in een variabele, en deze data wordt dan uitgelezen.


Het netwerkcomponent vult de levelconfig, en roept daarna de Constructor van level aan
Ons netwerkalgoritem is gebaseerd op een tokenring, dus als het token ontvagen wordt, moet bepaalde methoden van
het level object aangeroepen worden.

Het probleem:
Network uses Level, LevelConfig
Level uses Network //deze uses staat bij implementation, dus dat is geen probleem
LevelConfig uses Network

Ik wil in levelconfig een klasse opslaan van een type dat gedefinieerd is in network
En in Network wil ik een klasse creeeren die gedefinieerd is in LevelConfig


Oplossing:
Ik heb denk ik wel een oplossing, maar deze vind ik zeer lelijk.
Het NetWorkveld in LevelConfig van het type TObject maken,
en dan in TLevel elke keer als het gebruikt wordt een cast maken naar TNetwork

Een andere oplossing is om LevelConfig en NetWork in een unit te gooien, maar dit is ook lelijk.

Weet iemand hoe ik dit anders kan doen? Liefst zonder het hele ontwerp om te gooien.

  • joepP
  • Registratie: Juni 1999
  • Niet online
Als je ze binnen dezelfde unit gebruikt kan het als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TPunt = class;

  TVector = class
  public
    p1: TPunt;
    p2: TPunt;
  end;

  TPunt = class
  public
    v: TVector;
  end;


Als je circulair-references wil gebruiken buiten een enkele unit heb je pech, dat kan niet met Delphi.

edit:
Ik zie dat je dat al wist :)

[ Voor 7% gewijzigd door joepP op 21-05-2003 18:17 ]


Verwijderd

Dit kan dus wel, maar je zult dan wel veranderingen moeten aanbrengen. Je kunt gebruik maken van een forward, external decrleration. Voorwaarde is wel dat je de betreffende units als package of als .dll compiled.

Delphi:
1
TMijnClassUitAndereUnit =  class(TObject); external = 'andereunit.dll'

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Daar ben ik het niet helemaal mee eens hezik. external werkt alleen op dll's en dan nog alleen bij functies en procedures, niet bij classes. Bij packages doet Delphi het zelf al voor je en kan je ook classes op deze manier extern maken, maar blijf je dus zitten met je circulaire referenties.

Brokenp, de oplossing van TObject gebruiken had je zelf al aangedragen, maar is idd wat minder mooi. Wat je ook nog kan doen is een basis class of, nog mooier, een interface gebruiken waarvan beide units afweten. Ze weten dus alleen van die interface af, maar niet van elkaar. Deze interface of basis class kan je in een nieuwe unit stoppen die de beide usen.

We adore chaos because we like to restore order - M.C. Escher