[fpc-pascal] Interface performance
Tony Whyman
tony.whyman at mccallumwhyman.com
Fri Nov 11 10:56:45 CET 2016
On 11/11/16 09:46, Ryan Joseph wrote:
> Just as I got this message I’m running into some inexplicable memory related crashes casting from interfaces to objects and calling methods. Are you sure you can just cast these around like that? The compiler seems to get confused and lose track of what the type actually is. In my first test this didn’t happen and I was able to use an interface as a type then cast it to an object, pass to a function and call a method. In the 2nd example the variable went from a couple classes first and died at the end. Seems very unstable.
You will probably need to post some examples to get more help. But here
are some simple rules:
1. Classes that provide interfaces in most cases will have
TInterfacedObject as their ancestor.
2. If you have an object with a class definition that explicitly
supports a given interface then to get an interface reference all you
need to do is to assign it to a variable of the interface type.
3. To get an object back from an interface you must use the "as" operator.
e.g.
type
IMyInterface = interface
procedure MyProc;
end;
TMyObjectClass = class(TInterfacedObject,IMyInterface)
public
procedure MyProc;
end;
var MyObject1, MyObject2: TMyObjectClass;
MyInterface: IMyInterface;
begin
MyObject1 := TMyObjectClass.Create;
MyInterface := MyObject1;
MyInterface.MyProc;
MyObject2 := MyInterface as TMyObjectClass;
MyObject1.Free {OK for CORBA - will cause an exception in COM}
{MyObject1, MyObject2 and MyInterface are now all invalid}
end;
More information about the fpc-pascal
mailing list