Deklaracja obiektu klasy której jeszcze nie ma.

0

Szybkie pytanie, jest w delphi możliwość użycia w klasie obiektu innej klasy która zadeklarowana jest niżej w kodzie, i w tym samym unicie?

type
TKlasaJeden = class
private
...
public
 constructor Create(aObj: TKlasaDwa);
end;

TKlasaDwa = class
private
 fObj: TKlasaJeden; 
public
...
end;
2
type
TKlasaDwa = class;

TKlasaJeden = class
private
...
public
 constructor Create(aObj: TKlasaDwa);
end;
 
TKlasaDwa = class
private
 fObj: TKlasaJeden; 
public
...
end;
0

To właśnie stosuje, ale nie chce używać takiego rozwiązania bo powoduje to nieczytelność i ewentualny błąd przy późniejszym rzutowaniu, jeśli przekazany argument będzie innego typu, można to zabezpieczyć

 if fObj is TklasaDwa then
..

ale i tak na poziomie kodu kompilator nie wykryje ewentualnego błędu typu przekazywanego argumentu

0

Nie rozumiem? Nie widzę w tym żadnej nieczytelności i taka deklaracja jest całkiem poprawna a w ogóle o jaki "ewentualny" błąd chodzi? Możesz podać przykład?

1

rozwiązanie, które podał @kAzek to jest JEDYNE POPRAWNE rozwiązanie tego problemu

0

Tak o to chodziło @kAzek, dzięki

0

Innego rozwiązania raczej nie ma sensu szukać, bo forwardowanie właśnie do tego celu istnieje, aby móc skonkretyzować wszystkie typy danych w deklaracjach klas; Na siłę można by uniknąć forwardowania, zastosować ogólny typ TObject i wykonywać każdorazowe rzutowanie na właściwe klasy w definicjach metod, ale to kompletnie sensu nie ma;

Przy okazji - widzę, że Delphi nadal nie wspiera forwardowania klas przy wielu sekcjach Type; Z dokumentacji wynika, że aby poprawnie klasy były zadeklarowane, muszą być w jednej sekcji Type; Na szczęście FPC wspiera taką funkcję i można śmiało każdą deklarację typu poprzedzać wspomnianym słówkiem kluczowym:

type
  TKlasaDwa = class;
 
type
  TKlasaJeden = class
  private
    FObj: TKlasaDwa;
  public
    {..}
  end;
 
type
  TKlasaDwa = class
  private
    FObj: TKlasaJeden; 
  public
    {..}
  end;

Ja jestem zwolennikiem zapisu deklaracji każdej klasy w osobnej sekcji i zachowanie FPC bardziej mi odpowiada; Ale to tak w ramach ciekawostki, bo problem został już rozwiązany.

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