2012-05-12 6 views
3

親クラスのメソッドとフィールドをすべて使用するいくつかのサブクラスを持つクラスがあります。これを処理する "正しい"方法はありますか?ラケットサブクラスでのバインディングの自動継承

これまで私は(inherit method1 method2 ...)を各サブクラスで使用してきました。

私は、親クラスがサブクラスにバインディングを継承させる方法をvainで検索しましたが、それは悪いスタイルかもしれないことを理解しています。

RacketやOOPではあまり経験がありません。

答えて

2

inheritを使用しない場合でもメソッドは継承されます。 スーパークラスからメソッドを呼び出すには、(send this method arg1 ...)を使用できます。 クラスフォーム内のフォーム(inherit method)は、メソッドを体内のフォーム(method arg1 ...)で利用できるようにします。これは単なる便利な略語ではありませんが、(send this method)よりも効率的です。

私はパッケージ名が継承するフォームを認識していませんが、小さなマクロで自分自身をロールバックすることはできます。ここに例があります:

(define-syntax (inherit-from-car stx) 
    (datum->syntax stx '(inherit wash buy sell))) 

(define car% (class object% 
       (define/public (wash) (display "Washing\n")) 
       (define/public (buy) (display "Buying\n")) 
       (define/public (sell) (display "Selling\n")) 
       (super-new))) 

(define audi% (class car% (super-new) 
       (inherit-from-car) 
       (define/public (wash-and-sell) 
        (wash) 
        (sell)))) 

(define a-car (new audi%)) 
(send a-car wash-and-sell) 
+0

ありがとう! 私は同様のことをしようと考えましたが、datum->構文がわかりませんでした。 質問をしばらく開いたままにして、他の角があるかどうかを確認します。 – Erika

+0

私はラケットのクラスシステムでは、継承されたメソッドを明示的にリストする必要があると思います。他のクラスシステムには、異なる要件があります。ラケットはランタイムの値であるため少し面白いです:あなたは新しいクラスを即座に作ることができます。例:ミックスイン。残念なことに、この柔軟性は、スーパークラスが与えられているので、コンパイラが現在どのようなメソッドがスーパークラスで利用可能であるかを知ることができないという代償を払うことになります(http://docs.racket-lang.org/guide/classes.html)。コンパイル時の値ではなく実行時の値。しかし、あなたはいつもメッセージを送ることができます。例えば'(この洗濯を送る)' – dyoo