메서드 재정의
Method overridingMethod 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에서 자바와 유사하게 선언된 방법final
super 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 반항하다 메세지 놓다 "경고: 캘린더에 있는 날짜가 보기보다 더 가깝음 잘 하는 군요 종지부를 찍다 종지부를 찍다
메모들
- ^ 플래너건 2002, 페이지 107
- ^ a b 루이스 & 로프터스 2006, 페이지 454
- ^ 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.
- ^ 2006년 말리크 페이지 676
- ^ 마이어 2009, 572-575페이지
- ^ 데이텔 & 데이텔 2001, 페이지 474
- ^
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)수업의 터치: 객체 및 계약과 함께 잘 프로그래밍하는 방법 배우기.스프링거
외부 링크
- 헤만스 발라지의 자바 방법 재정의
- Nirosh L.w.C의 O.O.P. 개념 등에 대한 소개
- 태양 마이크로시스템에 의한 오버라이드 및 숨기기 방법