在打字的球拍中覆盖

时间:2017-02-14 10:49:52

标签: override racket typed-racket

如果我想将类型球拍中的类重写为无类型球拍,是否可能?如果有可能的话,我会非常感谢能否有人告诉我如何将这个下面提到的类型球拍类覆盖到无类型的球拍类?我想将“这是一个框架”中的文本替换为“这不是一个框架”。 注意:如果有任何其他可能的选项来替换文本,请告诉我。

(: frame (Instance (Class #:implements Frame%
                          (augment [on-close (-> Void)]))))
(define frame  
  (instantiate
   (class frame%
     (augment*
       [on-close 
        (lambda ()
          (send board-canvas stop-timer)
          (inner (void) on-close) )])
     (super-instantiate ()))
   ("this is a frame") ))

1 个答案:

答案 0 :(得分:0)

在您键入的代码中,您将frame定义为对象,而不是类。这是因为您使用了instantiate

通常你会覆盖 classes 中的内容。因此,要在另一个类中覆盖它,您需要将(class frame% ...)表达式从实例化表单中提取出来并将其定义为自己的子类。一旦有了名称,就可以多次使用它。

对于你想要做的事情,你不需要覆盖任何东西,你只需要用不同的值多次实例化这个类。

;; This class has been lifted out into its own definition, 
;; and given a name so that it can be used multiple times
(define my-frame%
  (class frame%
    (augment*
     [on-close 
      (lambda ()
        (send board-canvas stop-timer)
        (inner (void) on-close))])
    (super-instantiate ())))

(: frame (Instance (Class #:implements Frame%
                          (augment [on-close (-> Void)]))))
(define frame  
  (instantiate my-frame% ["this is a frame"]))

一旦你有自己定义的子类,你可以从键入的文件中provide

(provide my-frame%)

然后在无类型文件中使用它:

#lang racket
(require "the-typed-file.rkt")

(define frame-2
  (instantiate my-frame% ["a different frame label"]))

然而,这与覆盖无关。它只是给不同位置的构造函数赋予不同的值。