[fpc-pascal] casting interfaces and objects

Marc Santhoff M.Santhoff at t-online.de
Sun May 18 23:20:36 CEST 2008


Am Sonntag, den 18.05.2008, 17:54 -0300 schrieb Joao Morais:
> Marc Santhoff wrote:
> > Hi,
> > 
> > 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;
> 
> It is safe to store, it isn't safe to use as an object -- you will need 
> to cast back to IObserver to use the instance.

As always.

> > When using a cast from an interface to an object the compiler warns
> > about the class types "TObject" and "IObserver" not being related.
> > 
> > Since an implementor of in interface always will be a class type and any
> > class type at least inherits from TObject, I assume it is okay?
> 
> No no, they are quite different.

So that's why the compiler issues a warning.

> > Is there a better method of handling this case?
> 
> Use TInterfaceList or IInterfaceList.

That's nice, I only didn't know it until now.

> > 2. Will an interface and a class with the same signature but not
> > explicitely implementing this interface be runtime-compatible and
> > interchangably usable?
> 
> No. You need to include the interface in the class declaration or make a 
> workaround in the QueryInterface method.

Which is a pretty clear solution, it's only important to give the
programmer the opportunity to derive from a class or implement the
interface himself.

Many thanks,
Marc





More information about the fpc-pascal mailing list