Hallo Leuselator,
Interface-Properties können nicht im
OI angezeigt werden. Darüber hinaus würdest uU Probleme mit der impliziten Referenzzählung bekommen, wenn Du Aggregationen oder Kompositionen herstellen möchtest.
Ein Beispiel: Es ist zwar folgendes möglich
Delphi-Quellcode:
type
TMyClass = class
private
FAggregate: TMyAggregatedClass;
function GetAggregate: IMyAggregate;
public
property Aggregate: IMyAggregate
read GetAggregate;
end;
function TMyClass.GetAggregate: IMyAggregate;
begin
Result:= FAggregate as IMyAggregate; //as is optional
end;
Achtung: Sollte
TMyAggregatedClass von
TInterfacedObject oder einer ähnlichen Klasse mit automatischen Destructoraufruf bei
RefCount==0 geerbt worden sein, ist dieser Zugriff durch einen Zusätzlichen Aufruf von
_AddRef bzw.
_Release im Constructor/Destructor von
TMyClass zu "sichern", weil ein Klient mit Code dieser Art
Delphi-Quellcode:
myAggregate:= myObject.Aggregate;
myAggregate:= nil; //implicit call of myAggregate._Release
uU das Objekt
TMyClass.FAggregate freigibt und so eine ungültige Invariante von
TMyClass provoziert...
Eine Setter, wie Du ihn zu wünschen scheinst, also
Delphi-Quellcode:
type
TMyClass = class
//..
procedure SetAggregate(const AnAggregate: IMyAggregate);
ist schon vom Ansatz her sinnlos, wenn Du auf spezielle Methoden von konkreten Klassen (hier:
TMyAggregatedClass), die
IMyAggregate implementieren, zugreifen möchtest (das zumindest habe ich aus Deinem Posting gelesen).
Falls Dein eigentliches Problem die ständigen Casts bei Klassen sind, könntest Du es mit dem
visitor pattern oder dem
adaptor pattern (GoF) auch ohne Interfaces hinbekommen.
Vielleicht habe ich Dein Problem aber auch nicht ganz verstanden, könntest Du ggf ein gezieltes Bsp skizzieren?