我来自Java和Python,我很难理解面向对象代码在Racket中是如何工作的。
鉴于
(define food%
(class object%
(super-new)
(init-field name)
(field (edible? #t))
(init-field healthy?)
(init-field tasty?) ) )
定义一个超级水果%的食物%,它总是健康的? #t的值,和 哪个不需要设置健康?定义新水果的领域。
在racket / gui中,定义一个名为text-input-button%的按钮%的超类,它有两个新字段,输出(理想情况下是text-field%类型)和text(理想情况下是字符串),并且其回调字段的值为一个函数,该函数将文本字段的值附加到输出字段值的当前内容。实际上,按钮会将字符输入到指定的文本字段中。
我想如果我能看到这两个例子,我的大部分困惑都会得到解决。话虽这么说,我正在寻找“正确”或教科书的方法来做到这一点,而不是使用set!的一些圆形技巧,除非这是所有适当的方法归结为。
答案 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%
的子类,你可以,但我认为这更清晰。