Advertisement
Guest User

Untitled

a guest
Jan 29th, 2015
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.91 KB | None | 0 0
  1. #lang racket
  2.  
  3. (define sprite<%> (interface () draw))
  4. (define draw (generic sprite<%> draw))
  5.  
  6. (define pix%
  7. (class* object% (sprite<%>)
  8. (super-new)
  9. (define/public (draw)
  10. 'pix-draw)))
  11.  
  12. (define tex%
  13. (class* object% (sprite<%>)
  14. (super-new)
  15. (define/public (draw)
  16. 'tex-draw)))
  17.  
  18. ;; interface sprice<%>をimplせずにdrawを実装
  19. (define hoge%
  20. (class object%
  21. (super-new)
  22. (define/public (draw)
  23. 'hoge-draw)))
  24.  
  25. (define ls (list (new tex%) (new pix%) (new hoge%)))
  26.  
  27. ;; OK メソッド名だけでディスパッチ (ダックタイピング)
  28. (map (lambda (obj) (send obj draw))
  29. ls)
  30. ;;=> '(tex-draw pix-draw hoge-draw)
  31.  
  32.  
  33. ;; Type Error
  34. ;; 同じメソッド名でも、型が違えばエラー
  35. (map (lambda (obj)
  36. (send-generic obj draw) )
  37. ls)
  38.  
  39. ;;=> generic:draw: target is not an instance of the generic's interface
  40. ;; target: (object:hoge% ...)
  41. ;; interface name: sprite<%>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement