Thorsten Engler wrote:
IMO borland screwed up here when they introduced IInterface = IUnknown.
No they didn't.

IMO :)

It was IMo cleaner (and you can mix interface types)
There are no different "types" of interfaces in Delphi/Kylix. Even if there
were (like there are in FPC) you can never ever mix them.

when they declared it like:

type
   IInterface = interface
   end;

   IUnknown = interface(IInterface)
     _addref...
     _release....
     Query....
   end;

Lets assume we had that definition. Now look at this code:

Var
  Intf : Iinterface;
  Unk  : Iunknown;
Begin
  Unk := //... Get some Iunknown from somewhere
  Intf := Unk; //would be valid as Iunknown derives from Iinterface
               //but as Intf doesn't have an AddRef it can't be called.
  Unk := nil; //Unk has _release which is called and frees the object behind
the interface)
              //Intf now points to a freed object
End;

True, you need to know what you are doing. It is the same as P: Pointer; P ;= Unk;

(OK accessing methods is more dificult)


Beside that, that's the point of such a castrated Iinterface? What can you
do with it?

The same what you want to do with a CORBA interface ?

No QueryInterface, so you can't get from there to anything else.

You can say the same one you have assigned an object to an interface, no way back to the object. So once you assign a iunkown or object to the stripped iinterface you can only stay there. If you didn't want that, you shouldn't have used a iinterface in the first place (or cast it as you would have done with a pointer).

The as and is operators depend on either methods of Tobject (which can't be
reached) or information which is stored at negative offset in the VMT (which
isn't present for an interface VMT) so they can't be used either.

You can do 'is' and 'as' on IUnknown descendants now only too, so no difference.

The only advantage is that you *can* mix reference counted and non reference counted interfaces, where the non reference counted don't require the overhead of an additional exception handler. There are cases I only want the polymorf behaviour of interfaces and not the refercing

Marc
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to