2017-02-14 11 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

どういう意味ですか?あなたの質問のコードはクラスを定義していません。オブジェクトを定義します。 ''これはフレームです」 '' 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

はい、同じファイルに両方の名前を定義したりインポートしたりしない限り、オブジェクトに同じ名前を絶対に与えることができます。 –

関連する問題