代码示例球拍/ gui类

时间:2013-08-11 17:20:22

标签: racket

我来自Java和Python,我很难理解面向对象代码在Racket中是如何工作的。

  1. 鉴于

    (define food%
     (class object%
        (super-new)
        (init-field name)
        (field (edible? #t))
        (init-field healthy?)
        (init-field tasty?) ) )
    

    定义一个超级水果%的食物%,它总是健康的? #t的值,和 哪个不需要设置健康?定义新水果的领域。

  2. 在racket / gui中,定义一个名为text-input-button%的按钮%的超类,它有两个新字段,输出(理想情况下是text-field%类型)和text(理想情况下是字符串),并且其回调字段的值为一个函数,该函数将文本字段的值附加到输出字段值的当前内容。实际上,按钮会将字符输入到指定的文本字段中。

  3. 我想如果我能看到这两个例子,我的大部分困惑都会得到解决。话虽这么说,我正在寻找“正确”或教科书的方法来做到这一点,而不是使用set!的一些圆形技巧,除非这是所有适当的方法归结为。

1 个答案:

答案 0 :(得分:4)

(1)您是否真的认为fruit%应该是food%的超类?在我看来,你希望fruit%成为一个子类。这里假设它是一个子类:

(define fruit%
  (class food%
    (super-new [healthy? #t])))

(2)为此,我认为最好是根据panel%创建一个新的小部件来存储两个子小部件:

(define text-input-button%
  (class horizontal-panel%
    (super-new)
    (init-field text)
    ;; callback for the button
    (define (callback button event)
      (define new-value (string-append (send output get-value) text))
      (send output set-value new-value))
    (define button (new button% [label "Click me"]
                                [parent this]
                                [callback callback]))
    (define output (new text-field% [label "Output"]
                                    [parent this]))))

;; testing it out
(define f (new frame% [label "Test"]))
(define tib (new text-input-button% [text "foo"] [parent f]))
(send f show #t)

如果你真的想让它成为button%的子类,你可以,但我认为这更清晰。