메소드 오버라이딩

메소드 오버라이딩,(method overriding)은 객체 지향 프로그래밍에서 서브클래스 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 하나에 의해 이미 제공된 메소드를 특정한 형태로 구현하는 것을 제공하는 언어의 특징이다. 서브클래스에서의 구현은 부모 클래스에서 같은 이름, 같은 파라미터 또는 시그니처 그리고 같은 반환형을 갖는 메소드를 제공함으로써 슈퍼클래스에서의 구현을 오버라이드한다. 실행되는 메소드의 버전은 이것을 발생시키는데 사용되는 객체에 의해서 결정될 것이다. 만약 부모 클래스의 객체가 메소드를 발생시키는데 사용된다면 부모 클래스 버전이 실행될 것이지만, 만약 서브클래스의 객체가 메소드를 발생시키는데 사용된다면 자식 클래스 버전이 실행될 것이다. 몇몇 언어들은 프로그래머가 메소드를 오버라이딩하는 것을 예방하게할 수 있게 한다.
언어별 예시.
C++.
C++에서, 부모 또는 기본 클래스의 이름은 함수들을 오버라이드하기 위한 범위 지정 연산자(scope resolution operator) 이후에 사용된다. 예를 들면 다음의 코드는 두 클래스들을 나타내는데, 기본 클래스 codice_1, 그리고 유도 클래스 codice_2이 그것이다. codice_2는 codice_1 클래스의 codice_5 메소드를 오버라이드하며, 또한 자신의 높이를 보여준다.
class TRectangle
public:
 virtual void print() const;
private:
 double length;
 double width;
void TRectangle::print() const
 // print() method of base class.
 std::cout « "Length = " « this-&gt;length « "; Width = " « this-&gt;width;
class TBox : public TRectangle
public:
 // virtual is optional here, but it is a good practice to remind it to the developer.
 virtual void print() const;
private:
 double height;
// print() method of derived class.
void TBox::print() const
 // Invoke parent print() method.
 TRectangle::print();
 std::cout « "; Height = " « this-&gt;height;
클래스 codice_2에서 codice_5는 메소드 codice_5의 부모 버전을 불러일으킴으로써, 또한 기본 클래스의 private 변수 codice_9와 codice_10를 출력할 수 있다. 반면, 이러한 변수들은 codice_2에 접근할 수 없다.
다음 구문은 타입 codice_1 와 codice_2,의 객체들을 인스턴스화할 것이며, 그들 각각의 codice_5 메소드들을 호출한다:
int main(int argc, char** argv)
 TRectangle rectangle(5.0, 3.0);
 // Outputs: Length = 5.0; Width = 3.0
 rectangle.print();
 TBox box(6.0, 5.0, 4.0);
 // The pointer to the most overridden method in the vtable in on TBox::print,
 // but this call does not illustrate overriding.
 box.print();
 // This call illustrates overriding.
 // outputs: Length = 6.0; Width = 5.0; Height= 4.0
 static_cast&lt;TRectangle&amp;&gt;(box).print();
C++11에서는 자바와 비슷하게 슈퍼클래스에서 codice_15로 정의된 메소드는 오버라이딩될 수 없다; 또한 메소드는 컴파일러가 기본 클래스에서 메소드를 오버라이드하는지를 검사하기 위해 codice_16가 선언될 수 있다.
델파이.
델파이에서 메소드 오버라이딩은 지시자 override를 통해 수행되지만, 단지 메소드가 dynamic 또는 virtual 지시자로 표시되어야 한다.
inherited라는 단어는 슈퍼클래스 행동을 호출하기를 원할 때 반드시 호출되어야 한다.
type
 TRectangle = class
 private
 FLength: Double;
 FWidth: Double;
 public
 property Length read FLength write FLength;
 property Width read FWidth write FWidth;
 procedure Print; virtual;
 end;
 TBox = class(TRectangle)
 public
 procedure Print; override;
 end;
파이썬.
파이썬에서, 서브클래스는 슈퍼클래스의 메소드를 오버라이드하는 메소드를 포함하며, 또한 codice_17  대신 codice_18codice_19를 호출함으로써 슈퍼클래스를 호출할 수 있다.
class Thought(object):
 def __init__(self):
 pass
 def message(self):
 print "I feel like I am diagonally parked in a parallel universe."
class Advice(Thought):
 def __init__(self):
 super(Advice, self).__init__()
 def message(self):
 print "Warning: Dates in calendar are closer than they appear"
 super(Advice, self).message()
루비.
루비에서, 서브클래스는 슈퍼클래스의 메소드를 오버라이드하는 메소드를 포함하며, 또한 오버라이딩 된 메소드에서 super를 호출함으로써 슈퍼클래스를 호출할 수 있다. 만약 오버라이딩된 메소드 오버라이딩 메소드의 외부에서 보존되게 하고 싶다면 아래의 'super_message'와 함께 alias를 사용할 수 있다.
class Thought
 def message
 puts "I feel like I am diagonally parked in a parallel universe."
 end
end
class Advice &lt; Thought
 alias :super_message :message
 def message
 puts "Warning: Dates in calendar are closer than they appear"
 super
 end
end
Java.
 class Thought {
 public void message() {
 System.out.println("I feel like I am diagonally parked in a parallel universe.");
public class Advice extends Thought {
 @Override // @Override annotation in Java 5 is optional but helpful.
 public void message() {
 System.out.println("Warning: Dates in calendar are closer than they appear.");