2012-05-12 2 views
3

부모 클래스의 메서드와 필드를 모두 사용하는 여러 하위 클래스가 있습니다. 이것을 처리하는 "올바른"방법이 있습니까?라켓 하위 클래스의 바인딩 자동 상속

지금까지 각 하위 클래스에 (inherit method1 method2 ...)을 사용했습니다.

부모 클래스가 하위 클래스가 바인딩을 상속하도록 강제 할 수있는 방법을 vain에서 검색했습니다. 잘못된 스타일 일 수 있습니다.

라켓이나 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