Am Sonntag, den 18.05.2008, 23:07 +0200 schrieb Marco van de Voort: > > I have two questions about interface usage. > > > > 1. How interfaces are to handle when casting? > > Theoretically it should be safe to do this: > > > > TObservable = class > > public > > procedure Register( obsv: IObserver ); > > private > > procedure NotifyObservers(param: TParameter); > > fObservers: TFPObjectList; > > end; > > > > procedure TObservable.Register( obsv: IObserver ); > > begin > > fObservers.add(TObject(obsv)); > > end; > > No it is not safe. The interface points to an interface table, and you cast > it if it were a class VMT.
I see. I indeed had a somewhat "hacky" feeling using that cast ... Since the compiler dod not warn about using the "as" operator I assume it is safe? Like this: procedure TObservable.DeRegister( obsv: IObserver ); var i: integer; begin if (fObservers.count<=0) then exit; for i:=0 to fObservers.count-1 do begin if ((fObservers[i] as IObserver)=obsv) then begin fObservers.delete(i); fObservers.pack; exit; end; end; end; (Although this example will no longer exist when using an T/IInterfaceList.) > Have a look at IInterfaceComponentReference and use/implement the > getcomponent method. Note that this was added post-2.2.0 I'll have a look and put it on my todo-list. Thanks a lot, Marc _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal