inherited 사용하기

inherited 사용하기

오버라이드한 가상 메서드 안에서 부모 클래스의 구현을 호출해야 할 때가 자주 있어요. 이때 inherited 키워드를 써요. 마찬가지로 inherited는 부모 클래스의 어떤 메서드든 호출하는 데 쓸 수 있어요.

출처: Using inherited

본문

가장 단순한 경우부터 볼게요.


Type
 
  TMyClass = Class(TComponent)
 
    Constructor Create(AOwner : TComponent); override;
 
  end;
 

 
Constructor TMyClass.Create(AOwner : TComponent);
 

 
begin
 
  Inherited;
 
  // Do more things
 
end;

위 예시에서 Inherited 문장은 TComponent.Create를 호출하면서 AOwner를 매개변수로 전달해요. 즉 현재 메서드가 받은 것과 같은 매개변수를 부모의 메서드로 전달해요. 매개변수를 다시 지정할 필요가 없어요. 아무것도 지정하지 않으면 컴파일러가 받은 것과 동일한 인자를 전달해요.

같은 이름의 상속받은 메서드가 없다면, 이 경우 Inherited는 아무 효과가 없어요. 그러니 "오버라이드된 메서드가 있으면 호출하라"는 뜻으로 Inherited를 쓴다고 이해하면 돼요.

두 번째 경우는 조금 더 복잡해요.


Type
 
  TMyClass = Class(TComponent)
 
    Constructor Create(AOwner : TComponent); override;
 
    Constructor CreateNew(AOwner : TComponent; DoExtra : Boolean);
 
  end;
 

 
Constructor TMyClass.Create(AOwner : TComponent);
 
begin
 
  Inherited;
 
end;
 

 
Constructor TMyClass.CreateNew(AOwner : TComponent; DoExtra : Boolean);
 
begin
 
  Inherited Create(AOwner);
 
  // Do stuff
 
end;

CreateNew 메서드는 먼저 TComponent.Create를 호출하고 AOwner를 매개변수로 전달해요. TMyClass.Create는 호출하지 않아요.

부모 클래스에 주어진 이름의 메서드가 없으면 컴파일러가 오류를 내요.

예시는 생성자를 사용했지만, inherited의 사용이 생성자에만 제한되는 건 아니에요. 프로시저, 함수, 소멸자 어디에서든 쓸 수 있어요.

더 알아보기

  • 클래스 메서드(Class methods)
  • 클래스 생성자와 소멸자(Class constructors and destructors)