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

무엇을 의미합니까? 귀하의 질문에 코드가 클래스를 정의하지 않습니다; 객체를 정의합니다. '이것은 프레임입니다.''텍스트는 클래스가 아니라 객체의 속성입니다. 그게 당신이하려는 의미인가요? 아니면 그 인수에 대한 기본값을 가진 클래스를 만드는 것입니까? –

답변

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 my-frame%) 

그것을 provide 그리고 유형이 지정되지 않은 파일에서 사용할 수 있습니다 :

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

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

이가있다 그러나 오버라이드와는 아무런 관련이 없습니다. 그것은 단순히 다른 장소에서 생성자에게 다른 값을 제공합니다.

+0

정말 고마워요. 그것은 많은 것을 설명합니다. 두 파일 모두에서 프레임 이름을 동일하게 유지하려는 경우 다른 질문이 있습니다 (프레임 2가 아닌 프레임 만 가능). 가능합니까? –

+0

예, 동일한 파일에서 두 이름을 모두 정의하거나 가져 오지 않는 한 절대적으로 오브젝트에 동일한 이름을 지정할 수 있습니다. –

관련 문제