Delegates: Difference between revisions
Content added Content deleted
(Example of delegate that does not implement "thing") |
(Typos) |
||
Line 12: | Line 12: | ||
* Implement "thing" and return the string "delegate implementaion" |
* Implement "thing" and return the string "delegate implementaion" |
||
Show how objets are created and used. First, without a delegate, then with a delegate that does not implement |
Show how objets are created and used. First, without a delegate, then with a delegate that does not implement "thing", and last with a delegate that implements "thing". |
||
==[[Objective-C]]== |
==[[Objective-C]]== |
||
Line 72: | Line 72: | ||
assert([isEqualToString:@"delegate implementation"]); |
assert([isEqualToString:@"delegate implementation"]); |
||
// With a delegate that |
// With a delegate that implements "thing": |
||
Delegate *d = [[Delegate alloc] init]; |
Delegate *d = [[Delegate alloc] init]; |
||
[a setDelegate:d]; |
[a setDelegate:d]; |
||
Line 107: | Line 107: | ||
assert a.operation() == 'default implementation' |
assert a.operation() == 'default implementation' |
||
# With delegate that |
# With delegate that implements "thing" |
||
a.delegate = Delegate() |
a.delegate = Delegate() |
||
assert a.operation() == 'delegate implementation' |
assert a.operation() == 'delegate implementation' |
Revision as of 21:38, 3 October 2007
Delegates
You are encouraged to solve this task according to the task description, using any language you may know.
You are encouraged to solve this task according to the task description, using any language you may know.
A delegate is a helper object used by another object. The delegator may send the delegate certain messages, and provide a default implementation when there is no delegate or the delegate does not respond to a message. This pattern is heavily used in Cocoa framework on Mac OS X
Objects responsibilities:
Delegator:
- Keep an optional delegate instance.
- Implement "operation" method, returning the delegate "thing" if the delegate respond to "thing", or the string "default implementation".
Delegate:
- Implement "thing" and return the string "delegate implementaion"
Show how objets are created and used. First, without a delegate, then with a delegate that does not implement "thing", and last with a delegate that implements "thing".
Objective-C
@interface Delegator : NSObject { id delegate; } - (id)delegate; - (void)setDelegate:(id)obj; - (NSString *)operation; @end @implementation Delegator - (id)delegate; { return delegate; } - (void)setDelegate:(id)obj; { delegate = obj; // Weak reference } - (NSString *)operation; { if ([delegate respondsToSelector:@selector(thing)]) return [delegate thing]; return @"default implementation"; } @end // Any object may implement these @interface NSObject (DelegatorDelegating) - (NSString *)thing; @end @interface Delegate : NSObject // Don't need to declare -thing because any NSObject has this method @end @implementation Delegate - (NSString *)thing; { return @"delegate implementation"; } @end // Example usage // Memory management ignored for simplification int main() { // Without a delegate: Delegator *a = [[Delegator alloc] init]; assert([[a operation] isEqualToString:@"default implementation"]); // With a delegate that does not implement thing: [a setDelegate:@"A delegate may be any object"]; assert([isEqualToString:@"delegate implementation"]); // With a delegate that implements "thing": Delegate *d = [[Delegate alloc] init]; [a setDelegate:d]; assert([isEqualToString:@"delegate implementation"]); return 0; }
Python
class Delegator: def __init__(self): self.delegate = None def operation(self): if hasattr(self.delegate, 'thing'): return self.delegate.thing() return 'default implementation' class Delegate: def thing(self): return 'delegate implementation' if __name__ == '__main__': # No delegate a = Delegator() assert a.operation() == 'default implementation' # With a delegate that does not implement "thing" a.delegate = 'A delegate may be any object' assert a.operation() == 'default implementation' # With delegate that implements "thing" a.delegate = Delegate() assert a.operation() == 'delegate implementation'