Klasa z innego unitu

0

Cześć. Mam taki problem: Są dwa unity (w pierwszym jest komponent, w drugim jakieś klasy) skonstruowane mniej więcej tak:

unit1:

uses unit1;

type TObiekt1 = class;
       { jakieś pola }
       pole: TObiekt2;
       end;

unit2:

uses unit2;

interface
type TObiekt2 = class;
       { jakieś pola }
       pole: TObiekt1;
       end;
implementation
{ reszta }

Oczywiście mogę tylko w jednym unicie dodać do uses drugi unit (załóżmy, że zrobiłem w unicie1

uses unit2;

). Teraz chciałbym, żeby unit2 w sekcji interface "widział" TObiekt1. Próbowałem tak:

uses unit2;

interface

type TObiekt1 = class;

type TObiekt2 = class;
       { jakieś pola }
       pole: TObiekt1;
       end;
implementation
uses unit1;
{ reszta }

Ale przy odwołaniu w unit1 do pola typu TObiekt1 wyskakuje mi błąd, że są niekompatybilne typy unit1.TObiekt1 i unit2.TObiekt1. Jak zrobić, żeby w obydwóch unitach w sekcji interface były widoczne obiekty z drugiego unitu? Wiem, że trochę to mętnie brzmi, ale mam nadzieję, że zrozumieliście.

0

Mnie się wydaje, że tego wasnie sie zrobic nie da. Trzeba oba typy obiektowe umiescic w jednym unicie a nastepnie jeden "zaforwordować" (np. type Tobject1=class;) i wtedy będzie działało.

0

Właśnie tego się obawiałem. Co prawda, jeśli będzie to koniecznością to skopiuję wszystko do jednego pliku, jednakże wolałbym tego uniknąć. Ma ktoś jakieś inne sugestie?

0

W sekcji interface się nie da, jak napisano powyżej. Za to da się zrobić definicje w interface, a użycie w implementation. Jeśli potrzebujesz mieć oba w interface, zrób to w jednym unicie.

0

Co prawda tak sobie strzelam bo nie sprawdzałem tego ale ...:
Jeżeli obydwa unity są w ramach jednego projektu to po prostu dodaj ten drugi unit do projektu i powinno to załatwić sprawę albo spróbuj zadeklarować klasę abstrakcyjną po krórej twoje klasy będą dziedziczyć.... (jeżeli dobrze rozumiem o co ci chodzi)

Szczawik napisał(a)

Ja zrozumiałem, że chce on osiągnąć crossreference, czyli unit A z klasą TA wykorzystaną w B oraz unit B z klasą TB wykorzystaną w A.

Ja miałem na myśli to samo ale jeżeli oba unity są w ramach tego samego projektu to może w zarówno w unit1 jak również w unit2 wpisać w uses te unity...
Lub tak jak zaproponowałem za pomocą klasy abstakcyjnej (coś jak w Javie dziedziczenie w ramach tego sameg pakietu...) tylko że dostęp do klas musi być np. protected

0

Ja zrozumiałem, że chce on osiągnąć crossreference, czyli unit A z klasą TA wykorzystaną w B oraz unit B z klasą TB wykorzystaną w A.

0
type TObiekt1 = class;
       { jakieś pola }
       pole: TObiekt2;
       end;

type TObiekt2 = class;
       { jakieś pola }
       pole: TObiekt1;
       end;

Hm a jak to ma niby działać. Bo na pierwszy rzut oka to kazdy obiekt klasy TObiekt1 bedzie zawierał pole będące obiektem klasy TObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2, który będzie zawierał pole będące obiektem klasy TObiekt1, który będzie zawierał pole będące obiektem klasyTObiekt2,

no i chyba dalej nie musze pisac ;P

0

pq: np. tak można to wykorzystać:

type TObiekt1 = class;
       { jakieś pola }
       public
       obiekt2: TObiekt2;
       end;

type TObiekt2 = class;
       { jakieś pola }
       obiekt1: TObiekt1;
       public
       constructor Create;
       end;
implementation

constructor TObiekt2.Create;
begin
obiekt1:=TObiekt1.Create;
obiekt1.obiekt2:=self;
end;

Chyba jednak połączę wszystko w jeden unit, chociaż wcale nie jest to dla mnie dobre rozwiązanie :/

0
Bula napisał(a)
obiekt1.obiekt2:=self;

Ha, sprytne. Ot, i nauczyłem się czegoś na starość. :-)

Choć w zasadzie sam kiedyś coś podobnego robiłem, tylko w inny sposób.

Problem był taki, że miałem kilkupoziomową hierarchię klas (nie dziedziczenie), przy czym każde dziecko miało pole opisujące rodzica typu TRodzic (wartość przekazywana w konstruktorze), zaś rodzic miał pole będące listą dzieci. Dla uproszczenia i unknięcia circular refrences zrobiłem listy dzieci po prostu jako TObjectListz rzutowaniem np.

(Slice.SlicePoints[j] as TSlicePoint);

Deklaracje wyglądały tak:

type
TSlice=class;
TBrain=class;
TLink=class;

TSlicePoint=class(TObject)
  private
{...}
   fLinks:TObjectList;
{...}
  public
   Parent: TSlice;
   constructor Create(ParentSlice:TSlice);
{...}
end;

TSlice=class(TObject)
  private
   fSlicePoints:TObjectList;
{...}
  public
   Parent:TBrain;
   constructor Create(ParentBrain:TBrain);
{...}
end;

TLink=class(TObject)
  public
   Parent:TSlicePoint;
   constructor Create(ParentPoint:TSlicePoint);
  {...}
end;

TBrain=class(TObject)
  private
   fSlices:TObjectList;
{...}
  public
   constructor Create;
{...}
end;

No i nie miałem ambicji żeby to upychać po różnych unitach, w mojej sytacji jeden unit był całkiem naturalny...

1 użytkowników online, w tym zalogowanych: 0, gości: 1