2016-08-02 4 views
4

어떻게 하위 클래스의 메서드에서 수퍼 클래스의 메서드에 액세스 할 수 있습니까? 우리는 g의 구현에 우리는 유사 f의 슈퍼 클래스의 구현을 호출하려면, 이제 두 개의 클래스 수퍼 클래스의 멤버 함수 액세스

class parent definition. public section. methods f. endclass. class child definition inheriting from parent. public section. methods f redefinition. methods g. endclass. 

이 말할 수 있습니다 : 여기

문제가 보여주는 예입니다 주석에 명시된 바와 같이 문법적으로 잘못된 조각

class child implementation. 
    method g. 
    super->f(). "forbidden: super-> can only be used to call the previous implementation of the same method 
    endmethod. 
endclass. 

다음, super->을 사용할 수 없습니다. 도울 수 있니?

일부 인터넷 검색 후

, 그것은 child->gparent->f의 구현을 복사하는 제안 된이 할 수있는 유일한 방법은 정말?


f가 처음부터 다시 정의하는 이유를 물었다 @vwegert 실제 사용 사례

. 내 실제 사용 사례에서는 parent이보기이며 child 확장자입니다. child->f은 팝업을 발생시키는 이벤트 핸들러입니다. child은 팝업이 g 호출 형식으로 닫힐 때 콜백을 수신합니다. g이 호출되면 원래 구현 parent->f을 호출해야합니다.

+0

왜 처음부터 방법을 재정의합니까 ...? – vwegert

+1

@vwegert 질문에 실제 유스 케이스를 추가했습니다. 그러나 일반적인 질문에 대한 답변도 필요합니다. – niklasfi

답변

1

당신은 다소 추한 해결에 의지해야한다 - 등은 g에 플래그 (객체의 속성)을 설정 한 다음 플래그가 설정되어 있는지 확인하고 있는지 만 super->f를 호출 재정의 f를 호출합니다. 그것은 매우 부서진 디자인처럼 들리지만. 세부 사항은 다루지 않지만 상위 뷰를 변경할 수 없다고 가정합니다. 그렇지 않으면 불필요한 복잡성과 기술적 부채로 이어질 수 있으므로 설계를 다시 생각해보십시오. 유지 보수 비용을 증가시킵니다.

+0

@vwgert 이것은 실제로 내가 생각해 낸 해결책입니다. 이 질문을 좀 더 열어두면 더 나은 솔루션을 기대할 수 있습니다. 나는 결국 그것을 받아 들일 것이다. – niklasfi

0

부모 클래스에 do_f 보호 방법을 만든 다음 f 메서드에서 do_f 메서드로 컨트롤을 위임하는 데 신경 쓰지 않는다면. 그렇다면 다음 해결책은 상당히 깔끔한 해결책이 될 수 있습니다. 코드 중복이 없으며 "원래"f 방법으로 통화를 위임 할 때 추가 작업이 필요합니다.

REPORT zzy. 

CLASS parent DEFINITION. 
    PUBLIC SECTION. 
    METHODS f. 
    PROTECTED SECTION. 
    METHODS do_f. 
ENDCLASS. 

CLASS parent IMPLEMENTATION. 
    METHOD f. 
    do_f(). 
    ENDMETHOD. 

    METHOD do_f. 
    WRITE/'Parent''s f'. 
    ENDMETHOD. 
ENDCLASS. 

CLASS child DEFINITION INHERITING FROM parent. 
    PUBLIC SECTION. 
    METHODS: 
     f REDEFINITION, 
     g. 
ENDCLASS. 

CLASS child IMPLEMENTATION. 
    METHOD f. 
    WRITE/'Child''s f'. 
    ENDMETHOD. 

    METHOD g. 
    do_f(). 
    ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
    DATA(lo_child) = NEW child(). 
    lo_child->g(). 
    lo_child->f(). 
관련 문제