qmathe@club-internet.fr)Double dispatch facility
Copyright: (C) 2007 Quentin Mathe
- Declared in:
- NSObject+DoubleDispatch.h
@group Language Extensions
This category provides a visitor which supports double-dispatch on all visited objects without implementing extra methods (such as accept: on the visited object side).
For a more detailed discussion, see -visit: .
Here is a visitor example:
@interface ETView : NSView
@end
@interface UIVisitor : NSObject
@end
@implementation ETView
+ (NSString *) typePrefix
{
return @"ET";
}
@end
// To start using the visitor, instantiate a visitor and do [visitor visit: someWindow]
@implementation UIVisitor
// visitXXX methods return id, but returning void would be valid
- (id) visitWindow: (NSWindow *)aWindow
{
NSLog(@"Visiting window %@", aWindow);
return [self visit: [aWindow contentView]];
}
- (id) visitView: (NSView *)aView
{
NSLog(@"Visiting view %@", aView);
for (NSView *subview in [aView subviews])
{
[self visit: subview];
}
return nil;
}
// Show how you can include the class name prefix and how such a method has
// priority over a method without any type prefix such as -visitView:.
- (id) visitETView: (ETView *)aSpecialView
{
NSLog(@"Visiting special view %@", aSpecialView);
return nil;
}
@end
Returns the method name prefix used to build the method name to be invoked by the double dispatch.
By default, returns visit.
Can be overriden to return a custom prefix such as visit.
See also -visit: .
Builds and returns the selector to be invoked for a double dispatch on the given type.
For a detailed example, see -visit: .
Can be overriden in subclasses to implement an alternative strategy to build the method names targeted by the double dispatch.
Returns whether the receiver implements a double dispatch method that corresponds to the given object type.
This method serves a similar purpose than -[NSObject respondsToSelector:].
See also -visit: .
Tries to invoke the selector with the
given object as first argument, and
returns either the value returned by the invoked
method or nil.
If the receiver doesn't respond to the
selector, performed is set to
NO and nil is returned,
otherwise performed is set
YES.
Tries to build a method name based on the given object type and invoke it.
For example, if you have a NSView, and you pass it as
an argument to
-visit:
, the selector visitNSView: is built and
invoked with the given view on the receiver. If
the receiver doesn't respond to visitNSView:
, then visitView: is built by trimming the
class name prefix, and invoked. If the receiver
still doesn't respond the last built selector, then
it fails silently and returns nil.
Class name prefix are trimmed
based on the value returned by +[NSObject(Etoile)
typePrefix]. You can override this last
method to return a custom prefix, by default it
returns NS.
If you want to use another method name prefix than visit (e.g. to build a selector such as renderView:), -doubleDispatchPrefix can be overriden.
Subclasses can override this method, if they want to customize the double-dispatch behavior.
Does the same than
-visit:
but reports whether a double-dispatch method was
succesfully invoked by setting
performed to YES, or
NO when no such method was found.
See also -visit: and -supportsDoubleDispatchWithObject: .
This method is called by -visit: and implements the double-dispatch logic.