2017-02-14 2 views
-1

Si je veux passer d'une raquette dactylographiée à une raquette non typée, est-ce possible? Si c'est possible, je serai très reconnaissant si quelqu'un peut me dire comment passer outre cette classe de raquette typée ci-dessous à classe de raquette non typé? Je veux remplacer le texte de "ceci est un cadre" par "ceci n'est pas un cadre". Note: Si une autre option possible pour remplacer le texte, s'il vous plaît dites-moi.override dans une raquette typée

(: 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

Je ne sais pas exactement ce que vous demandez quand vous dites "remplacer une classe d'une raquette typée par une raquette non typée". Voulez-vous dire créer une sous-classe non typée d'une classe définie dans une raquette typée? Ou voulez-vous convertir le code de votre question en une raquette non typée? Ou voulez-vous simplement créer une classe qui remplace une méthode? Ou demandez-vous quelque chose d'autre? –

+0

Supposons que cette classe se trouve dans un fichier de raquette typé. Je veux inclure ce fichier dans un fichier de raquette non typé. Je veux convertir ce morceau de code en un fichier de raquette non typé et ensuite vouloir remplacer de telle façon qu'il puisse remplacer le texte "ceci est une image" par un autre texte. donc quand j'exécuterai le fichier non typé, il me montrera le texte remplacé en sortie. –

+0

Que voulez-vous dire? Le code de votre question ne définit pas de classe; il définit un objet. Le texte '' this is a frame "' est une propriété de l'objet, pas la classe. Est-ce ce que vous vouliez faire, ou vouliez-vous créer une classe avec une valeur par défaut pour cet argument? –

Répondre

0

Dans votre code typé, vous définissez frame comme un objet, pas une classe. C'est parce que vous avez utilisé instantiate.

Normalement, vous remplacez les choses de classes. Donc, pour remplacer cela dans une autre classe, vous devrez lever l'expression (class frame% ...) du formulaire d'instanciation et la définir comme sa propre sous-classe. Une fois qu'il a un nom, vous pouvez l'utiliser plusieurs fois.

Pour ce que vous voulez faire, vous n'avez pas besoin de surcharger quoi que ce soit, il vous suffit d'instancier cette classe plusieurs fois avec des valeurs différentes.

;; 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"])) 

Une fois que vous avez la sous-classe dans sa propre définition, vous pouvez provide à partir du fichier typé

(provide my-frame%) 

Et puis utilisez dans le fichier typées:

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

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

Cela a rien à voir avec le dépassement, cependant. C'est simplement donner une valeur différente au constructeur dans différents endroits.

+0

Merci beaucoup. Ça explique beaucoup. J'ai une autre question, si je veux garder le même nom de frame dans les deux fichiers (pas frame-2, only frame), est-ce possible? –

+0

Oui, vous pouvez absolument donner le même nom aux objets, tant que vous n'essayez pas de définir ou d'importer les deux noms dans le même fichier. –