클래스 헬퍼의 제약 — 무엇을 확장할 수 없나
클래스 헬퍼의 제약 — 무엇을 확장할 수 없나
아무 메서드나 프로퍼티로 클래스를 확장할 수 있는 건 아니에요. 가능성에 몇 가지 제약이 있어요.
본문
클래스 헬퍼에는 다음과 같은 제약이 있어요.
- 소멸자나 클래스 소멸자는 허용되지 않아요.
- 클래스 생성자는 허용되지 않아요.
- 클래스 헬퍼는 레코드 헬퍼에서 하위로 파생될 수 없고, 레코드 타입을 확장할 수 없어요.
- 필드 정의는 허용되지 않아요. 클래스 필드도 마찬가지예요.
- 필드를 참조하는 프로퍼티는 허용되지 않아요. 이는 사실 이전 항목의 결과예요.
- 추상 메서드는 허용되지 않아요.
- 클래스의 가상 메서드는 오버라이드할 수 없어요. 같은 이름을 주면 숨길 수 있고,
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;를 명시적으로 붙여야 한다는 점을 다시 확인하게 돼요. 붙이지 않으면 두 메서드가 충돌해서 원하는 대로 동작하지 않아요.
더 알아보기
- 클래스 헬퍼의 기본 개념은 Definition을 참고하세요
- 레코드 헬퍼의 제약은 Restrictions on record helpers에서 다뤄요