Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Private interface-Deklarationen?
tommie-lie - Do 10.07.03 22:21
Titel: Private interface-Deklarationen?
Hallo,
Ich hätte da mal eine Frage zur Deklaration von Klassen.
Und zwar deklariere ich bisher meine Klassen wie folgt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| interface
type TEnhFModSys = class end;
TCallbackThread = class(TThread) end;
TEnhFSoundStream = class private FCBThread: TCallbackThread; end; |
TCallbackThread muss vor TEnhFSoundStream deklariert werden, weil ich ja ein Field habe, daß von diesem Typ ist. Wenn ich diese Unit jetzt irgendwo einbinde, habe ich logischerweise Zugriff auf die Klasse TEnhFModSys und TEnhFSoundStream. Aber ich kann auch auf TCallbackThread zugreifen, was nicht sein sollte.
Kann man eine Deklaration zwar im interface-Teil haben, sie aber trotzdem verstecken, sodaß sie außerhalb dieser Unit nicht sichtbar ist?
Deklariere ich die Klasse erst im implementation-Teil, findet er natürlich den Datentyp für mein Field FCBThread nicht, eine globale Variable, die erst im implementation-Abschnitt deklariert wird, ist wegen der Möglichkeit, TEnhFSoundStream mehrmals zu instanziieren nicht akzeptabel.
In eine seperate Unit sollte TCallbackThread nur ausgelagert werden, wenn es wirklich nicht anders geht.
AndyB - Do 10.07.03 22:35
Du könntest die FCBThread als TThread deklarieren und die Klasse TCallbackThread dann im implementation Abschnitt implementieren. Wenn du dann auf Eigenschaften und Methoden von TCallbackThread zugreifen willst, musst du FCBThread eben typecasten.
tommie-lie - Do 10.07.03 22:49
Stimmt, das wäre eine Möglichkeit (wieso bin ich da nicht selbst drauf gekommen?).
Danke!
Aber wenn jemand noch weiß, wie es einfacher geht, bin ich für weitere Vorschläge offen :-)
Motzi - Fr 11.07.03 09:46
Weiß jetzt nicht ob das geht (glaub aber fast nicht) daher ist es eher ne Frage als ne Antwort, aber... kann man im interface-Teil die Forward-Deklaration machen und erst im implementations-Teil die Klassen-Deklaration?
maximus - Fr 11.07.03 10:50
| Motzi hat folgendes geschrieben: |
| Weiß jetzt nicht ob das geht (glaub aber fast nicht) daher ist es eher ne Frage als ne Antwort, aber... kann man im interface-Teil die Forward-Deklaration machen und erst im implementations-Teil die Klassen-Deklaration? |
Leider nein :cry: habs gestern glatt mal getestet, weils mich auch interessiert hat...schade eigendlich
AndyB - Fr 11.07.03 13:08
Über den Umweg mit Interfaces lässt sich das schon machen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| ITest = interface procedure MyMethod; end;
implementation
type TTest = class(TInterfacedObject, ITest) procedure MyMethod; end;
procedure TTest.MyMethod; begin ShowMessage('Hier'); end; |
maximus - Fr 11.07.03 14:49
Aber ITest bzw. TTest soll ja gerade nicht sichtbar sein, aber trotzdem im interface-teil verfügbar sein :? Wenn man sich das recht überlegt macht das ja auch keinen sinn, weil man ja, beim zugriff, über die andere klasse, die sichtbarkeit braucht...
macht das sinn..?
tommie-lie - Fr 11.07.03 15:02
| Motzi hat folgendes geschrieben: |
| Weiß jetzt nicht ob das geht (glaub aber fast nicht) daher ist es eher ne Frage als ne Antwort, aber... kann man im interface-Teil die Forward-Deklaration machen und erst im implementations-Teil die Klassen-Deklaration? |
Selbst wenn es gehen würde (forward über implementation-interface-Grenze hinweg), wäre es besser, FCBThread als TThread zu deklarieren und später zu typecasten, weil ich dann die Klasse selbst nicht sehen würde.
Das mit der interface-Deklaration werde ich mir mal genauer anschauen, aus irgendeinem Grund kenne ich das gar nicht (steht das im OPLG :?!?:)...
| maximus hat folgendes geschrieben: |
| Aber ITest bzw. TTest soll ja gerade nicht sichtbar sein, aber trotzdem im interface-teil verfügbar sein :? Wenn man sich das recht überlegt macht das ja auch keinen sinn, weil man ja, beim zugriff, über die andere klasse, die sichtbarkeit braucht... |
Jein. Es ist schon ein wenig wiedersinnig, aber ich brauche den Callback-Thread nur innerhalb dieser einen Klasse, er wird also nur in der Unit benutzt. Von außen soll er gar nicht benutzt werden können, TEnhFSoundStream aber schon.
Im Prinzip ist es nur ein Schönheitsfehler, daß man TCallbackThread auch von außen sieht, weil man ihn ja einfach links liegen lassen könnte, aber ich fände es schöner, wenn man ihn gar nicht erst sieht ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!