2017-02-14 5 views
-1

Если я хочу переопределить класс от типизированной ракетки до нетипизированной ракетки, возможно ли это? если это возможно, я буду очень благодарен, если кто-нибудь скажет мне, как переопределить этот нижеприведенный типизированный класс ракетки для нетипизированного класса ракетки? Я хочу заменить текст «это кадр» на «это не кадр». Примечание: Если есть какая-либо другая возможность заменить текст, пожалуйста, скажите мне.переопределить в типизированной ракетке

(: 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"))) 
+0

Я не уверен, что вы спрашиваете, когда говорите «переопределить класс от типизированной ракетки до нетипизированной ракетки». Вы имеете в виду создание нетипизированного подкласса класса, определенного в типизированной ракетке? Или вы хотите преобразовать код в свой вопрос в нетипизированную ракетку? Или вы просто хотите создать класс, который переопределяет метод? Или вы спрашиваете что-то еще? –

+0

Предположим, этот класс находится в типизированном файле ракетки. Я хочу включить этот файл в нетипизированный файл ракетки. Я хочу преобразовать этот фрагмент кода в нетипизированный файл ракетки, а затем хочу переопределить такой способ, чтобы он мог заменить текст «это кадр» на любой другой текст. поэтому, когда я запускаю нетипизированный файл, он покажет мне замененный текст как вывод. –

+0

Что значит? Код в вашем вопросе не определяет класс; он определяет объект. '' This является фреймом ''text является свойством объекта, а не класса. Это то, что вы хотели сделать, или вы хотели создать класс со значением по умолчанию для этого аргумента? –

ответ

0

В коде типизированного вы определяете frame как объект, а не класс. Это потому, что вы использовали instantiate.

Обычно вы отменяете вещи от классов. Чтобы переопределить это в другом классе, вам нужно снять выражение (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"])) 

Это имеет Однако ничего общего с переопределением. Это просто дает другое значение конструктору в разных местах.

+0

Большое вам спасибо. Это многое объясняет. У меня есть другой вопрос, если я хочу сохранить имя фрейма одинаковым в обоих файлах (не фрейм-2, только кадр), возможно ли это? –

+0

Да, вы можете абсолютно дать объектам одинаковое имя, если вы не пытаетесь определить или импортировать оба имени в один и тот же файл. –

Смежные вопросы