Delegates: Difference between revisions

1,332 bytes added ,  14 years ago
added a Common Lisp solution
m (severalomit from)
(added a Common Lisp solution)
Line 72:
delegate implementation
</pre>
 
=={{header|Common Lisp}}==
 
In CLOS, methods exist apart from classes, and are specialized based on the types of their arguments. This example defines two classes (delegator and delegate), and a thing generic method which is specialized in three ways: (1) for 'any' argument, providing a default method; (2) for delegators, where thing is recursively applied to the delegator's delegate (if there is one); and (3) for delegates.
 
<lang lisp>(defgeneric thing (object)
(:documentation "Thing the object."))
 
(defmethod thing (object)
"default implementation")
 
(defclass delegator ()
((delegate
:initarg :delegate
:reader delegator-delegate)))
 
(defmethod thing ((delegator delegator))
"If delegator has a delegate, invoke thing on the delegate,
otherwise return \"no delegate\"."
(if (slot-boundp delegator 'delegate)
(thing (delegator-delegate delegator))
"no delegate"))
 
(defclass delegate () ())
 
(defmethod thing ((delegate delegate))
"delegate implementation")
 
(let ((d1 (make-instance 'delegator))
(d2 (make-instance 'delegator :delegate nil))
(d3 (make-instance 'delegator :delegate (make-instance 'delegate))))
(assert (string= "no delegate" (thing d1)))
(assert (string= "default implementation" (thing d2)))
(assert (string= "delegate implementation" (thing d3))))</lang>
 
=={{header|D}}==
Anonymous user