Autor Beitrag
Apuch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27

Kubuntu 9.04, Win 2000
Delphi 7
BeitragVerfasst: Fr 30.10.09 16:43 
Hallo,

hab ein kleines Problem mit der Delphi-Syntax.. gibt es in Delphi so etwas wie Vorwärtsdeklarationen von Klassen und Interfaces? Konkretes Beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  ISceneObject = interface(IInterface)
    function Draw(scene : TScene) : Boolean;
  end;

  TScene = class(TObject)
    public
      procedure Add(obj : ISceneObject);
  end;


Das ISceneObject braucht eine Typdefinition von TScene und anders herum. Es handelt sich also um eine einfache Mutter-Kind-Beziehung, wobei beide Klassen voneinander wissen. Ein ISceneObject kann dabei mehreren TScenes zugeordnet sein.

In C++ war es eine einfache Vorwärtsdeklaration (d.h. eine kurze Ankündigung, das irgendwann eine Klasse XYZ auftaucht). In Delphi ist dies anscheinend nicht möglich. Stellt sich natürlich die Frage: Wieso????

Was ist ein halbwegs eleganter Workaround?
- Mit TObject bzw. Pointern arbeiten? -> Typencheck durch Compiler ausgehebelt/ Lesbarkeit drastisch verringert
- Gemeinsame Basisklasse? -> Es sind keine gemeinsamen Basistypen und es währe möglich, ein TScene als SceneObject unterzujubeln
- Separate Liste (TSceneObjectList) in einer separaten Unit -> Dreiecksbeziehung/ auch nicht wirklich elegant. Und der Softwareentwurf wird der Sprache angepasst -> ganz schlechtes Zeichen

btw: Gibt es in Delphi7 irgend etwas vergleichbares zu C++-Templates? Mich stören die ganzen Casts in meinem Code:?

MfG

_________________
DasLebenIstZuKurzFürWhitespaces!
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Fr 30.10.09 16:51 
user profile iconApuch hat folgendes geschrieben Zum zitierten Posting springen:
In C++ war es eine einfache Vorwärtsdeklaration (d.h. eine kurze Ankündigung, das irgendwann eine Klasse XYZ auftaucht). In Delphi ist dies anscheinend nicht möglich.

Ist in Delphi genauso möglich :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
 TScene = Class;
 ISceneObject = interface(IInterface)
    function Draw(scene : TScene) : Boolean;
  end;
Apuch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27

Kubuntu 9.04, Win 2000
Delphi 7
BeitragVerfasst: Fr 30.10.09 17:34 
grmpf..

Hatte es natürlich selbst schon probiert.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  TScene = class(TObject); // Fail
  ISceneObject = interface(IInterface)
    function Draw(scene : TScene) : Boolean;
  end;

  TScene = class(TObject)
  end;

  TScene = class// Funktioniert
  ISceneObject = interface(IInterface)
    function Draw(scene : TScene) : Boolean;
  end;

  TScene = class(TObject)
  end;


Ersteres war natürlich meine Variante :? Bei google hab ich auch Threads in anderen Foren gefunden, die genau das selbe behaupteten (zB hier. Bin halt neu in Delphi und noch nicht wirklich überzeugt ;)

Danke für die Schnelle Antwort

MfG

_________________
DasLebenIstZuKurzFürWhitespaces!