; modeling inheritance - sports team ; We need to manually implement the axiom: ; "Every instance of a subclass contains an instance of the superclass" (define (team wins losses) (define (win) (set! wins (+ wins 1))) (define (lose) (set! losses (+ losses 1))) (define (wp) (/ (* 1.0 wins) (+ wins losses))) ; winning percentage (define (betterthan other) (> (wp) (other 'wp))) (define (interface method) (cond ((equal? method 'win) (win)) ((equal? method 'lose) (lose)) ((equal? method 'wp) (wp)) ((equal? method 'betterthan) betterthan) ; function returned (#t 'error) )) interface) ; body of team just returns interface function. (define mets (team 0 10)) (define yankees (team 10 0)) (mets 'lose) (yankees 'win) (if ((yankees 'betterthan) mets) "yankees better" "not!") ; Now we want to define football team subclass with a new field ; "quarterback" ; How do we model inheritance here? We explicitly define an ; instance of the "superclass" within the football team closure (define (fbteam qb) (define super (team 0 0)) ; call superclass constructor (define (whosqb) qb) ; returns quarterback (define (changeqb newqb) (set! qb newqb)) ; change the quarterback (lambda (method) ; interface for fbteam objects (cond ((equal? method 'whosqb) (whosqb)) ((equal? method 'changeqb) changeqb) (#t (super method))))) ; default invokes superclass method! (define jets (fbteam "vinnie")) (jets 'lose) (jets 'lose) (jets 'lose) ((jets 'changeqb) "vinnie's grandma") (jets 'win) (jets 'wp)