메서드 재정의

Method overriding
삽화

Method overriding, 객체 지향 프로그래밍에서, 하위 클래스나 하위 클래스가 그것의 슈퍼 클래스나 상위 클래스들 중 하나가 이미 제공하고 있는 메서드의 구체적인 구현을 제공할 수 있도록 하는 언어 기능이다.특정 유형의 다형성(하위형)을 허용한다.하위 클래스의 구현은 상위 클래스의 방법과 이름, 매개변수 또는 서명이 같고 반환 유형이 동일한 방법을 제공하여 수퍼 클래스의 구현을 재정의(대체)한다.[1]실행된 메서드의 버전은 메서드를 호출하는 데 사용되는 객체에 의해 결정된다.부모 클래스의 개체를 사용하여 메서드를 호출하면 부모 클래스의 버전이 실행되지만 하위 클래스의 개체를 사용하여 메서드를 호출하면 자식 클래스의 버전이 실행된다.[2]어떤 언어는 프로그래머가 어떤 방법이 오버라이드되는 것을 막을 수 있게 한다.

언어별 예

에이다

에이다님은 디폴트로 메서드 오버라이드를 제공한다.조기 오류 감지(예: 오자)를 선호하기 위해, 메서드가 실제로 오버라이드될 것으로 예상되는 시기를 지정할 수 있다.그것은 컴파일러에 의해 확인될 것이다.

  타자를 치다 T 이다 새로운 통제된 ,with ......;   절차 op(오비: 밖으로 T; 데이터: 정수);    타자를 치다 NT 이다 새로운 T ,with 무효 기록;   우선하는    -- 우선 순위 표시기   절차 op(오비: 밖으로 NT; 데이터: 정수);   우선하는    -- 우선 순위 표시기   절차 op(오비: 밖으로 NT; 데이터: );   -- ^ 컴파일러에서 오류 발생: 하위 프로그램 "Op"가 재정의되지 않음 

C#

C#는 메서드 재정의를 지원하지만, 수식어를 사용하여 명시적으로 요청된 경우에만 지원override그리고virtual또는abstract.

추상적 계급 애니멀 {     공중의          끈을 매다 이름 { 얻다; 세트; }     // 방법     공중의          공허하게 하다   마시다();     공중의 가상의  공허하게 하다   먹다();     공중의          공허하게 하다   가다(); }  계급 고양이 : 애니멀 {     공중의 새로운      끈을 매다 이름 { 얻다; 세트; }     // 방법     공중의          공허하게 하다   마시다();  // 경고: 상속된 음료()를 숨긴다.새 항목 사용     공중의 무효로 하다 공허하게 하다   먹다();    // 상속된 식사()를 재정의한다.     공중의 새로운      공허하게 하다   가다();     // 상속된 go()를 숨긴다. } 

한 방법을 다른 방법으로 재정의할 때, 두 방법의 서명은 동일해야 하며 (그리고 가시성이 동일해야 한다.)C#에서는 클래스 메서드, 인덱서, 속성 및 이벤트를 모두 재정의할 수 있다.

비가상 또는 정적 메서드는 재정의할 수 없다.재정의된 기본 방법은 가상, 추상 또는 재정의여야 한다.

메서드 재정의를 위해 사용되는 수식어 외에, C#는 상속된 속성이나 메서드를 숨길 수 있다.이것은 속성이나 메서드의 동일한 서명을 사용하지만 수식어를 추가new[3]앞에

위의 예에서 숨기는 것은 다음과 같은 원인이 된다.

고양이 고양이를 = 새로운 고양이();  고양이를.이름 = ;             // Cat에 액세스.이름 고양이를.먹다();                // 캣을 부른다.식사() 고양이를.가다();                 // 캣을 부른다.고() ((애니멀)고양이를).이름 = ;   // Animal에 액세스.이름! ((애니멀)고양이를).먹다();      // 캣을 부른다.()먹어라! ((애니멀)고양이를).가다();       // Animal을 부른다.고()! 

C++

C++에 키워드가 없음super하위 클래스가 Java에서 오버라이드하려는 메서드의 수퍼 클래스 버전을 호출하는 데 사용할 수 있다.대신 상위 또는 기본 클래스의 이름을 사용하고 그 뒤에 스코프 분해능 연산자를 사용한다.예를 들어, 다음 코드는 두 가지 클래스를 나타낸다.Rectangle, 그리고 파생 클래스Box.Box…을 무시하다Rectangle반의Print높이를 인쇄하기 위한 방법.[4]

#include <아이오스트림>  //--------------------------------------------------------------------------- 계급 직사각형 {  공중의:   직사각형(곱절로 하다 l, 곱절로 하다 w) : 길이_(l), 폭_(w) {}   가상의 공허하게 하다 인쇄하다() 경시하다;   사유의:   곱절로 하다 길이_;   곱절로 하다 폭_; };  //--------------------------------------------------------------------------- 공허하게 하다 직사각형::인쇄하다() 경시하다 {   // 기본 클래스의 인쇄 방법   찌꺼기::뻐드렁니가 나다 << "길이 = " << 길이_ << "; 너비 = " << 폭_; }  //--------------------------------------------------------------------------- 계급 상자 : 공중의 직사각형 {  공중의:   상자(곱절로 하다 l, 곱절로 하다 w, 곱절로 하다 h) : 직사각형(l, w), 높이_(h) {}   공허하게 하다 인쇄하다() 경시하다 무효로 하다;   사유의:   곱절로 하다 높이_; };  //--------------------------------------------------------------------------- // 파생 클래스의 인쇄 방법. 공허하게 하다 상자:인쇄() 경시하다 {   // 상위 Print 메서드를 호출하십시오.   직사각형::인쇄하다();   찌꺼기::뻐드렁니가 나다 << "; 높이 = " << 높이_; } 

방법Print수업 중인Box, 메서드의 상위 버전을 호출하여Print은 또한 개인 변수를 출력할 수 있다. length그리고width기본급의그렇지 않으면 이 변수들은 다음에 접근할 수 없다.Box.

다음 문장은 유형 객체를 인스턴스화한다.Rectangle그리고Box, 그리고 각각을 호출한다.Print방법:

인트로 본래의(인트로 argc, 마를 뜨다** 아그브) {   직사각형 직사각형(5.0, 3.0);    // 출력:길이 = 5.0, 너비 = 3.0   직사각형.인쇄하다();    상자 권투를 하다(6.0, 5.0, 4.0);    // 상자의 vtable에서 가장 재정의된 메서드에 대한 포인터:인쇄,   // 그러나 이 통화는 재정의를 나타내지 않는다.   권투를 하다.인쇄하다();    // 이 통화는 재정의를 예시한다.   // 출력:길이 = 6.0, 너비 = 5.0, 높이 = 4.0   정적_캐스트<직사각형&>(권투를 하다).인쇄하다(); } 

C++11에서 자바와 유사하게 선언된 방법finalsuper class에서는 재정의할 수 없다. 또한 메서드를 선언할 수 있다.override컴파일러가 기본 클래스의 메서드를 재정의하는지 검사하도록 하십시오.

델파이

델파이에서 메서드 오버라이드는 지시 재정의(direction override)로 수행되지만, 동적 또는 가상의 지시로 메서드가 표시된 경우에만 수행된다.

상속된 예약어는 슈퍼클래스 행동을 부르고 싶을 때 불러야 한다.

타자를 치다   TRectangle = 계급   사유의     플렝스: 더블;     FWidth: 더블;   공중의     재산 길이 읽다 플렝스 글씨를 쓰다 플렝스;     재산  읽다 FWidth 글씨를 쓰다 FWidth;      절차 인쇄하다; 가상의;   종지부를 찍다;    트박스 = 계급(TRectangle)   공중의     절차 인쇄하다; 무효로 하다;   종지부를 찍다; 

에펠

에펠에서 피쳐 재정의가 C++ 및 자바에서 메서드를 재정의하는 것과 유사하다.재정립은 재조립으로 분류되는 세 가지 형상적응 형태 중 하나이다.또한 재구성은 부모 클래스에서 이연(추상)된 형상에 대해 구현이 제공되는 효과와 부모 클래스에서 유효(구체적)했던 형상이 상속인 클래스에서 다시 이연되는 정의에 대해서도 다룬다.형상을 재정립할 때 형상의 이름은 상속인 계급에 의해 유지되지만, 형상의 서명, 계약(전제조건사후조건에 대한 제한을 존중함) 및/또는 이행과 같은 특성의 속성은 상속인에서 달라진다.상속자의 특징의 전조로 불리는 부모계급의 본래의 특징이 효과적이라면, 상속자의 재정립된 특성은 효력이 있을 것이다.전조가 유예되면 상속인의 특성은 유예된다.[5]

다음과 같이 기능을 다시 정의하고자 하는 의도message아래 예에서, 에서 명시적으로 선언되어야 한다.inherit상속인 계급의 조항

계급     생각 특집 기사     메세지             -- 사고 메시지 표시         하다             인쇄하다 ("나는 평행 우주에 대각선으로 주차되어 있는 기분이야.%N")         종지부를 찍다 종지부를 찍다  계급     조언 물려받다     생각         재정의하다             메세지         종지부를 찍다 특집 기사     메세지             -- 전구체         하다             인쇄하다 ("경고: 달력의 날짜는 보이는 것보다 더 가깝다.%N")         종지부를 찍다 종지부를 찍다 

수업 중인ADVICE특집 기사message동급에서 그것의 전구체와는 다른 구현이 주어진다.THOUGHT.

두 가지 모두에 대해 인스턴스를 사용하는 클래스를 고려하십시오.THOUGHT그리고ADVICE:

계급     적용 만들다     만들다 특집 기사      만들다             -- 응용 프로그램 실행.         하다             (만들다 {생각}).메세지;             (만들다 {조언}).메세지         종지부를 찍다 종지부를 찍다 

인스턴스화되면 클래스APPLICATION다음과 같은 출력을 생성한다.

평행 우주에 대각선으로 주차되어 있는 기분이다.경고: 달력의 날짜는 보기보다 더 가깝다. 

재정의된 기능 내에서 언어 키워드를 사용하여 기능의 전구체에 대한 액세스를 얻을 수 있다.Precursor. 의 구현을 가정한다.{ADVICE}.message다음과 같이 변경된다.

    메세지             -- 전구체         하다             인쇄하다 ("경고: 달력의 날짜는 보이는 것보다 더 가깝다.%N")             전구체         종지부를 찍다 

형상의 호출은 이제 의 실행을 포함한다.{THOUGHT}.message및 다음과 같은 출력을 생성한다.

경고: 달력의 날짜는 보기보다 더 가깝다.평행 우주에 대각선으로 주차되어 있는 기분이다. 

자바

자바에서는 서브클래스에 슈퍼클래스 메서드를 재정의하는 메서드가 포함되어 있을 때 키워드를 사용하여 슈퍼클래스 메서드를 호출할 수도 있다. super예:[2]

계급 생각했다 {     공중의 공허하게 하다 메세지() {         시스템.밖으로.인쇄하다(평행 우주에 대각선으로 주차된 느낌"이라고 말했다.);     } }  공중의 계급 조언 연장하다 생각했다 {     @오버라이드  // @Java 5의 오버라이드 주석은 선택 사항이지만 유용하다.     공중의 공허하게 하다 메세지() {         시스템.밖으로.인쇄하다("경고: 달력의 날짜는 보이는 것보다 더 가깝다.");     } } 

클래스Thought슈퍼클래스를 대표하고 메서드 콜을 구현한다.message(). 서브클래스가 불렀다.Advice에 있을 수 있는 모든 방법을 상속하다.Thought수업. 하지만 수업.Advice방법을 무시하다message(), 기능 교체Thought.

생각했다 주차 = 새로운 생각했다(); 주차.메세지();  // "나는 평행 우주에 대각선으로 주차된 기분이다."라고 인쇄한다.  생각했다 날짜 = 새로운 조언();  // 다형성 날짜.메세지();  // "경고: 캘린더에 있는 날짜가 보기보다 더 가깝다. 

super참고가 될 수 있다

공중의 계급 조언 연장하다 생각했다 {       @오버라이드       공중의 공허하게 하다 메세지() {           시스템.밖으로.인쇄하다("경고: 달력의 날짜는 보이는 것보다 더 가깝다.");           잘 하는 군요.메세지();  // 부모 버전의 메서드를 호출하십시오.       } 

하위 클래스가 무시할 수 없는 방법이 있다.예를 들어, 자바에서는 슈퍼클래스에서 최종으로 선언된 메서드는 재정의할 수 없다.비공개 또는 정적으로 선언된 방법은 암묵적으로 최종적이기 때문에 무시할 수 없다.기말고사 판정을 받은 클래스가 슈퍼클래스가 되는 것도 불가능하다.[6]

코틀린

코틀린에서 우리는 간단히 이와 같은 함수를 재정의할 수 있다(함수는 반드시open):

재미있다 본래의() {     발랄하게 하다 p = 부모(5)     발랄하게 하다 c = 아이(6)     p.마이펀()     c.마이펀() }  개방된 계급 부모(발랄하게 하다 a : 인트) {     개방된 재미있다 마이펀() = 인쇄하다(a) }  계급 아이(발랄하게 하다 b : 인트) : 부모(b) {     무효로 하다 재미있다 마이펀() = 인쇄하다("변위법") } 

파이톤

파이톤에서는 서브클래스에 슈퍼클래스의 메서드를 재정의하는 메서드가 포함되어 있을 때, 전화를 걸어 슈퍼클래스 메서드를 호출할 수도 있다.super(Subclass, self).method[7] 대신에self.method예:

계급 생각했다:     반항하다 __init___(자아의) -> 없음:         인쇄하다("나는 사상의 새로운 대상이야!")     반항하다 메세지(자아의) -> 없음:         인쇄하다(평행 우주에 대각선으로 주차된 느낌"이라고 말했다.)  계급 조언(생각했다):     반항하다 __init___(자아의) -> 없음:         잘 하는 군요(조언, 자아의).__init___()     반항하다 메세지(자아의) -> 없음:         인쇄하다("경고: 캘린더에 있는 날짜가 보기보다 더 가깝음)         잘 하는 군요(조언, 자아의).메세지()  t = 생각했다() # "나는 새로운 타입 사상의 대상이다!" t.메세지() # "나는 평행 우주에 대각선으로 주차되어 있는 기분이다.  a = 조언() # "나는 새로운 타입 사상의 대상이다!" a.메세지() # "경고: 달력 속 날짜는 보기보다 가깝다" # "나는 평행 우주에 대각선으로 주차되어 있는 기분이다.  # ------------------ # 자기성찰:  현시점(t, 생각했다) # 참  현시점(a, 조언) # 참  현시점(a, 생각했다) # 참 

루비

루비에서는 서브클래스에 슈퍼클래스의 메서드를 오버라이드하는 메서드가 포함되어 있을 때, 그 오버라이드 방식으로 슈퍼클래스 메서드를 호출하여 슈퍼클래스 메서드를 호출할 수도 있다.아래 'super_message'와 같이 오버라이드 메서드를 오버라이드 메서드 외부에서 사용 가능한 상태로 유지하려면 별칭을 사용하십시오.

예:

계급 생각했다   반항하다 메세지     놓다 평행 우주에 대각선으로 주차된 느낌"이라고 말했다.   종지부를 찍다 종지부를 찍다  계급 조언 < 생각했다   가명 :super_super :message   반항하다 메세지     놓다 "경고: 캘린더에 있는 날짜가 보기보다 더 가깝음     잘 하는 군요   종지부를 찍다 종지부를 찍다 

메모들

  1. ^ 플래너건 2002, 페이지 107
  2. ^ a b 루이스 & 로프터스 2006, 페이지 454
  3. ^ Mössenböck, Hanspeter (2002-03-25). "Advanced C#: Overriding of Methods" (PDF). Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. pp. 6–8. Retrieved 2011-08-02.
  4. ^ 2006년 말리크 페이지 676
  5. ^ 마이어 2009, 572-575페이지
  6. ^ 데이텔 & 데이텔 2001, 페이지 474
  7. ^ super().method Python 3의 경우 - 웨이백 머신에서 https://docs.python.org/3/library/functions.html#superArchived 2018-10-26 참조

참고 항목

참조

  • 디텔, H. M&Deitel, P. J.(2001).Java How to Programme (제4판)어퍼 새들 리버, NJ: 프렌티스 홀.
  • Lewis, J. & Loftus, W. (2008)Java: Software Solutions (6차 개정).보스턴, MA: 피어슨 애디슨 웨슬리.
  • 말릭, D. S. (2006년)C++ 프로그래밍: 데이터 구조를 포함한 프로그램 설계. (3차 개정)워싱턴 DC: 코스 테크놀로지.
  • 플래너건, 데이빗(2002).단순의 자바.http://oreilly.com/catalog/9780596002831/preview#preview에서 검색됨
  • 마이어, 버트랜드(2009)수업의 터치: 객체계약과 함께 잘 프로그래밍하는 방법 배우기.스프링거

외부 링크