3

親クラスのメソッドとフィールドをすべて使用するいくつかのサブクラスを持つクラスがあります。これを処理する「正しい」方法はありますか?

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

親クラスがサブクラスにバインディングを強制的に継承させる方法を探しましたが、それが悪いスタイルである可能性があることは理解しています。

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

4

1 に答える 1

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)
于 2012-05-12T13:21:29.887 に答える