클래스 헬퍼의 제약 — 무엇을 확장할 수 없나

클래스 헬퍼의 제약 — 무엇을 확장할 수 없나

아무 메서드나 프로퍼티로 클래스를 확장할 수 있는 건 아니에요. 가능성에 몇 가지 제약이 있어요.

출처: Restrictions on class helpers — Free Pascal Reference

본문

클래스 헬퍼에는 다음과 같은 제약이 있어요.

  • 소멸자나 클래스 소멸자는 허용되지 않아요.
  • 클래스 생성자는 허용되지 않아요.
  • 클래스 헬퍼는 레코드 헬퍼에서 하위로 파생될 수 없고, 레코드 타입을 확장할 수 없어요.
  • 필드 정의는 허용되지 않아요. 클래스 필드도 마찬가지예요.
  • 필드를 참조하는 프로퍼티는 허용되지 않아요. 이는 사실 이전 항목의 결과예요.
  • 추상 메서드는 허용되지 않아요.
  • 클래스의 가상 메서드는 오버라이드할 수 없어요. 같은 이름을 주면 숨길 수 있고, overload 지시자로 오버로드할 수 있어요.
  • 일반 프로시저나 메서드와 달리, 클래스 헬퍼에서 클래스의 메서드를 오버로드할 때는 overload 지정자를 명시적으로 사용해야 해요. overload를 쓰지 않으면 확장 타입의 메서드는 헬퍼 메서드에 숨겨져요(일반 클래스에서처럼).

다음은 ToString 메서드를 오버로드하도록 이전 예제를 수정한 거예요.

TObjectHelper = class helper for TObject
  function ToString(const aFormat: String): String; overload;
end;

function TObjectHelper.ToString(const aFormat: String): String;
begin
  Result := Format(aFormat, [ToString]);
end;

var
  o: TObject;
begin
  Writeln(o.ToString('The object''s name is %s'));
end.

여기서 헬퍼 멤버를 오버로드할 때 overload;를 명시적으로 붙여야 한다는 점을 다시 확인하게 돼요. 붙이지 않으면 두 메서드가 충돌해서 원하는 대로 동작하지 않아요.

더 알아보기