DEFSTRUCT
General Form:
DEFSTRUCT can be considered similar to a DEFRECORD but the component fields are individually initialised when it is instantiated. However it acts more like a class in that it has inheritance through the EXTENDS clause. A base struct can be subclassed by defining the new struct with a EXTENDS STRUCT referencing the base struct. This new struct will have all the fields of the base struct the new fields.
This class-like behaviour also includes class methods which can be declared as FLDs and which, when invoked will always pass the structure BYREF as an extra first argument.
DEFSTRUCT c
FLD n AS Integer
FLD x$ AS INIT PTR
FLD m = 'myFn
END STRUCT
DEFSUB 'myFn(BYREF this$_c, arg$)
REDIM FLD(this$.x$) = arg$
END SUB
LOCAL DIM c$_c, c
c$.m("Hello")
c = NEW _c
SYM(*c)$.m("World")
When a structure is extended the base methods can be redefined.
DEFSTRUCT like DEFRECORD supports a local scoped variant LOCAL DEFSTRUCT.
A DEFSTRUCT will occupy more memory than a DEFRECORD with the same FLDs because of the class overhead.
Constructor / Destructor
DEFSTRUCT also has two special methods which are automatically invoked on creation and deletion of the variable.
$COMPLIANCE 3
DEFSTRUCT c
FLD Constructor = 'myConstructor
FLD Destructor = 'myDestructor
END STRUCT
DEFSUB 'myConstructor(BYREF this$_c)
PRINT "Constructor"
END SUB
DEFSUB 'myDestructor(BYREF this$_c)
PRINT "Destructor"
END SUB
'main()
$END
DEFSUB 'main()
LOCAL DIM c$_c
PRINT "*****"
ENDSUB
Output
Constructor ***** Destructor
Compatibility
DEF STRUCT was introduced with KCML 6.90.
See also: