Implicit Get/SetProperty calls in user-defined classes
Anonym
Operator overloading in user-defined classes was introduced in IDL 8 through the IDL_Object class. Mike Galloy explains how to use this technique
here.
One somewhat overlooked feature of IDL_Object is that it allows implicit calls to the GetProperty and SetProperty methods of a class. As a rule, member variables of an IDL class are protected, so you can’t access them directly outside the class definition. For example, COLOR is a property of IDLgrSurface in the Object Graphics (OG) system. Trying to access a surface’s color directly results in an error:
IDL> s = idlgrsurface()
IDL> print, s.color
% Object instance data is not visible outside class methods: S
% Execution halted at: $MAIN$
The correct way to get the surface’s color is through its GetProperty method:
IDL> s.getproperty, color=c
IDL> print, c
0 0 0
Though this is by design, it’s (arguably) inconvenient.
OG classes aren’t subclassed from IDL_Object, but it’s easy to create a new set of classes that inherit from both OG and IDL_Object. For example, here’s an extension of IDLgrSurface:
pro esggrsurface__define
compile_opt idl2
!null = {esggrsurface, inherits idlgrsurface, inherits idl_object}
end
This new class (ESG = Educational Services Group, a namespace I’ve adopted) is everything that IDLgrSurface is, but we also get the implicit Get/SetProperty feature of IDL_Object. Note that I haven't overridden IDLgrSurface's Init, Cleanup, GetProperty or SetProperty methods (though if I desired, I could, but that's a topic for another post). To see how this works, make a new instance of ESGgrSurface with some test data and get its color with an implicit GetProperty call:
IDL> s = esggrsurface(dist(30))
IDL> print, s.color
0 0 0
Note that you must use the dot “
.
” method invocation operator to access this functionality; the arrow “
->
” operator won’t work here. Now change the color of the surface with an implicit SetProperty call and view it with XOBJVIEW:
IDL> s.color = !color.blue
IDL> xobjview, s
I’ve made extensions to a few of the OG classes (download them from
here). You can use these as examples for subclassing other OG classes. I want to give credit to Jim Pendleton, one of my IDL gurus; I'm pretty sure I got this idea of extending OG from discussions with him.
In a subsequent post I’ll present a more detailed example of how this implicit Get/SetProperty feature works.