Sorry to be late in the conversation... >> Here is a simple example how it should be used >> >> type >> IReportable = interface >> function Report: string; >> // let's say that this should write report and >> // return status description as string >> end; >> >> ILogged = interface >> procedure Log(aStr: string); >> end;
Surely, using Delphi's way of things: type TMyReport = class(TInterfacedObject, IReportable, ILogged) ... //an implementation of each interface end; >> procedure MyXYZPart.DoReport(aRep: IReportable); >> begin >> if (aRep <> nil) then begin >> if (aRep is ILogged) then >> (aRep as ILogged).Log(aRep.Report) >> else >> aRep.Report >> end; Again : procedure MyXYZPart.DoReport(aRep: IReportable); var tmp: ILogged; begin if (aRep <> nil) then begin if (aRep.QueryInterface(ILogged, tmp) = S_OK) then tmp.Log(aRep.Report) //or you could just do the as cast.. else aRep.Report end; > I see what you want, but if you would do > > procedure MyXYZPart.DoReport(aRep: TInterfacedObject); > > begin > if (aRep <> nil) and arep is IReportable then begin > if (aRep is ILogged) then > (aRep as ILogged).Log(aRep.Report) > else > aRep.Report > end; Converting interfaces to instances to object instances is a bad idea... it screws with reference counting, for a start...> This still does not explain why you would need to do > AClassInstance := AnInterface; I think the above is a really bad idea. Especially when the implementing class is private... e.g. interface type IPublic = interface procedure whatever; end; TFactory = class function newPublic: IPublic; end; implementation type TPrivate = class(TInterfacedObject, IPublic) ... end; function TFactory.newPublic: IPublic; begin Result := TPrivate.Create; // or implement some kind of class // pooling etc .. end; How would you be able to get at the class? Only as TObject or TInterfacedObject. Bad idea. Matt _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal