X
12790 Rate this article:
No rating

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. Read this subsequent post where I present a more detailed example of how this implicit Get/SetProperty feature works.