[Insight-developers] InvokeEvent / Observer / Command

Luis Ibanez ibanez@cs.unc.edu
Mon, 22 Jan 2001 11:02:50 -0500


Hi Brad,

I checked in the changes to itkCommand and itkLightObject.

In CStyleCommand a second pointer to function was added.
Its name is not very original now:    "FunctionPointer2"
and its member variable is   "m_Callback2"   ...
Please feel free to change them if you find a better
descriptive name.


Thanks,

Luis


Brad King wrote:

> Luis,
>
> Will and I looked over this solution briefly, and it looks fine to
> us.  It sounds like you already have it implemented.  Go ahead and check
> in the changes, and I will add the const smart-pointer support using the
> mutable reference count approach.
>
> -Brad
>
> On Sat, 20 Jan 2001, Luis Ibanez wrote:
>
> > Hi,
> >
> >
> > There is another easy alternative to get around
> > the 'const' problem with the Command::Execute()
> > method.
> >
> > The option is to define in the itk::Command class,
> > two Execute() methods, one with a normal pointer to
> > LigthObject and the other with a const pointer, as:
> >
> > Command::Execute(       LightObject * , Event e ) = 0;
> > Command::Execute( const LightObject * , Event e ) = 0;
> >
> >
> > Then, in SubjectImplementation class create an
> > additional InvokeEvent method, that receives a const
> > pointer to Light object, like:
> >
> > SubjectImplementation::InvokeEvent( Event e, const LightObject * )
> > {
> >   // with the same body that the non-const InvokeEvent method
> > }
> >
> >
> > and finally in LightObject add a const InvokeEvent() method,
> >
> >
> > LightObject::InvokeEvent( Event e ) const
> > {
> >   // the same body as the non-const InvokeEvent method
> > }
> >
> >
> >
> > In this way, when a const LightObject calls its InvokeEvent()
> > method, the const version of the method will be selected.
> > This version uses in its body the (const *) version of the
> > SubjectImplementation::InvokeEvent() method, and this one
> > will call the version of the Command::Execute() method that
> > receives a pointer to const LightObject.
> >
> > This seems to be better that the previous suggestion
> > of creating a PassiveCommand / ActiveCommand pair,
> > and having two separate list of observers in the
> > SubjectImplementation class.
> >
> > One advantage of this option is that the current hierarchy
> > of Command's can be keept (with the only addition of the
> > Execute( const LightObject *, Event ) method in the
> > classes that derive from itk::Command.
> >
> >
> > This hierarchy actually looks like:
> >
> >
> >     +-------------+
> >     | LightObject |
> >     +-------------+
> >            | (has one)
> >            V
> >   +---------------------+ (points to many) +--------+
> >   |SubjectImplementation|----------------->|Observer|
> >   +---------------------+                  +--------+
> >                                                 | (has one)
> >                                                 V
> >                                            +---------+
> >                                            | Command |
> >                                            +---------+
> >                                                 |
> >                                                 |
> >                                +----------------+
> >                                |
> >                                | (derivation)
> >                                |
> >          +---------------------+---------------------+
> >          |                     |                     |
> >          V                     V                     V
> >  +---------------+  +---------------------+  +---------------+
> >  | MemberCommand |  | SimpleMemberCommand |  | CStyleCommand |
> >  +---------------+  +---------------------+  +---------------+
> >
> >
> >
> > The only class that need more modifications with this option,
> > is CStyleCommand, which has a pointer to a normal C function
> > that receives a (LightObject *, Event).  It will need now a
> > second pointer to a C function that receives (const LightObject *,
> > Event ). Its second Execute() method will call this new pointer to
> > function  while the original Execute method will still use the
> > original pointer to C function.
> >
> > These modification compile fine, and as far as I've tested
> > it seems to run ok.
> >
> >
> >
> >
> > Luis
> >
> >
> >
> >
>
> _______________________________________________
> Insight-developers mailing list
> Insight-developers@public.kitware.com
> http://public.kitware.com/mailman/listinfo/insight-developers