Last active
May 31, 2016 02:30
-
-
Save khirbat/0093e892ad3e69042f6d07383ece4d80 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;;; MIXIN | |
;;;; https://en.wikipedia.org/wiki/Mixin#In_Common_Lisp | |
(defgeneric object-width (object) | |
(:documentation | |
"Generic function with one argument using the + method | |
combination. The + method combination determines that all | |
applicable methods for a generic function will be called and the | |
results will be added.") | |
(:method-combination +)) | |
(defclass button () | |
((text :initform "click me")) | |
(:documentation "Class with one slot for the button text.")) | |
(defmethod object-width + ((object button)) | |
"Method for objects of class button that computes the width based on | |
the length of the button text. + is the method qualifier for the | |
method combination of the same name." | |
(* 10 (length (slot-value object 'text)))) | |
(defclass border-mixin () | |
() | |
(:documentation | |
"A border-mixin class. The naming is just a convention. No superclasses. No slots.")) | |
(defmethod object-width + ((object border-mixin)) | |
"Method for computing the width of the border. Here it is just 4." | |
4) | |
(defclass bordered-button (border-mixin button) | |
() | |
(:documentation "Class inheriting from both border-mixin and button.")) | |
;; We can now compute the width of a button. Calling object-width | |
;; computes 80. The result is the result of the single applicable | |
;; method: the method object-width for the class button. | |
;; ? (object-width (make-instance 'button)) | |
;; 80 | |
;; We can also compute the width of a bordered-button. Calling | |
;; object-width computes 84. The result is the sum of the results of | |
;; the two applicable methods: the method object-width for the class | |
;; button and the method object-width for the class border-mixin. | |
;; ? (object-width (make-instance 'bordered-button)) | |
;; 84 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment