Interfaces |
Top Previous Next |
What is translated > Types > Records, Classes, Interfaces > Interfaces
In Delphi interface types can be defined like in the following lines of code:
IConverter = interface ['{GUID}'] function convert(Source : String): String; end;
TConverter = class(TInterfacedObject, IConverter) public //... function convert(Source : String): String; end;
For C++Builder the special macro "__interface" macro:
#define __interface struct // in sysmac.h
is used instead of the class keyword to mark interfaces:
__interface INTERFACE_UUID("{ GUID}" ) IConverter { virtual String __fastcall convert(String Source); };
class TConverter : public TInterfacedObject, public IConverter { //... String __fastcall convert(String Source); };
However there will be a linker error like "unresolved vtable", if such an interface is used. If you create a small pas file for the interface, add it to the C++Builder project and remove the C++ definition for the interface, C++Builder will create a header file for the interface file automatically, which you can include then. Example pas file:
unit Recyclable;
interface
type IRecyclable = Interface(IInterface) function GetIsRecyclable : Boolean; property isRecyclable : Boolean read GetIsRecyclable; end;
implementation end.
->
#include "Recyclable.hpp"
Now the project will compile without linker error.
Visual C++ also knows this keyword, but the GUID has to be written differently:
[ uuid( "GUID" ) ] __interface IConverter { virtual String convert(String Source); };
class TConverter : public TInterfacedObject, IConverter { //... String convert(String Source); };
At other compilers, which have not the interface extension, multiple inheritance can be used instead, As explained here:
http://www.codeproject.com/Articles/10553/Using-Interfaces-in-C
the interface class needs a virtual destructor and the methods should be public and declared abstract:
//[ uuid( "GUID" ) ] class IConverter { public: virtual ~IConverter() {} virtual String convert(String Source) = 0; };
class TConverter : public TInterfacedObject, IConverter { //... String convert(String Source); };
GUID's cannot be used here. Under Microsoft Windows GUID's are used for COM purposes.
|
This page belongs to the DelphiXE2Cpp11 Documentation |
DelphiXE2Cpp11 home Content |