#lang racket/gui ;;; chap14.rkt - Les sources du chapitre 14 (Objets et API graphique) ;;; Livre PCPS : "Premiers Cours de Programmation avec Scheme" ;;; Langage determine par le source (require "show.rkt") ; pour les tests (provide (all-defined-out)) ; pour les exercices "Section 14.2" (define pile% ; ligne 1 page 314 (class object% ; une sous-classe de object% (define L '()) ; un champ prive (define/public (vide?) ; methode publique (null? L)) (define/public (sommet) ; methode publique (if (null? L) (error "Pile vide !") (car L))) (define/public (empiler x) ; methode publique (set! L (cons x L))) (define/public (depiler) ; methode publique (if (null? L) (error "Pile vide !") (set! L (cdr L)))) (super-new))) ; le constructeur de la classe mere object% (define p (new pile%)) ; ligne 13 (show (send p empiler 'a)) (show (send p empiler 'b)) (show (send p empiler 'c)) (show p) ; sans l'inspecteur, on ne voit pas les valeurs des champs ! (show (send p vide?)) (show (send p sommet)) (show (send p depiler)) (show (send p sommet)) (define balle% ; ligne 26 (class object% (inspect (make-inspector)) ; optionnel, pour inspecter un objet de la classe balle% (init-field (a 0) (b 0)) (define L (cons a b)) ; sauvegarde de la position initiale (define/public (pos) (list a b)) (define/public (reset) (set! a (car L)) (set! b (cdr L))) (define/public (move dx dy) (set! a (+ a dx)) (set! b (+ b dy))) (super-new))) (define b1 (new balle% (a 10))) ; ligne 37 (show b1) (show (send b1 pos)) (show (send b1 move 5 2)) (show (send b1 pos)) (show (send b1 reset)) (show (send b1 pos)) (define b2 (new balle% (a 10))) ; ligne 48 (show b2) (show (send b2 move 5 2)) (printf "Avec l'inspecteur, on voit les valeurs des champs dans l'ordre où ils sont déclares :\n") (show b2) "Section 14.3 : les sous-classes et l'heritage" (define balle-gonflable% ; ligne 54 (class balle% ;(inspect (make-inspector)) (init-field (r 10)) (define/public (rayon) r) (define/public (gonfle dr) (set! r (+ r dr))) (super-new))) ; a=0 et b=0 par defaut (define b3 (new balle-gonflable% (r 20))) ; ligne 62 (show (and (is-a? b3 balle%) (is-a? b3 balle-gonflable%) (is-a? b3 object%))) (show (send b3 move 2 5)) (show (send b3 pos)) (show (send b3 gonfle 10)) (show (send b3 rayon)) (define balle-bizarre% ; ligne 74 (class balle-gonflable% (inherit-field a b) (define/override (move) (set! a (+ a (random 5))) (set! b (+ b (random 5)))) (super-new))) (define b4 (new balle-bizarre%)) (show (send b4 pos)) (show (send b4 move)) (show (send b4 pos)) ;;; je fais une affectation entre classes pour la redefinir ! (set! balle-bizarre% ; ligne 81 (class balle-gonflable% (define/override (move) (super move (random 5) (random 5))) (super-new))) (define b5 (new balle-bizarre%)) (show (send b5 pos)) (show (send b5 move)) (show (send b5 pos)) "*** API graphique ***" "Section 14.4.1 : voir le fichier api1.rkt" "Section 14.4.2 : voir le fichier api2.rkt" "Section 14.4.3 : voir le fichier api3.rkt" "Section 14.4.4 : voir les fichiers api4.rkt et api4-on-char.rkt" "Section 14.4.6 : voir le fichier api5.rkt" "Section 14.4.7 : voir le fichier api5-db.rkt" "Section 14.4.8 : voir le fichier api5-timer.rkt"