레코드 헬퍼의 제약 — 레코드는 클래스와 달라요
레코드 헬퍼의 제약 — 레코드는 클래스와 달라요
레코드는 클래스가 제공하는 것과 같은 가능성을 제공하지 않아요. 이는 레코드 헬퍼를 만들 때의 가능성에도 그대로 반영돼요. 아래에 레코드 헬퍼의 제약을 정리했어요.
본문
- 레코드 헬퍼는 클래스를 확장하는 데 사용할 수 없어요. 다음은 실패해요.
TTestHelper = record helper for TObject
end;
- 헬퍼 선언 안에서는 확장 레코드의 메서드/필드를 예를 들어 프로퍼티 정의에서 접근할 수 없어요. 물론 구현에서는 접근할 수 있어요. 즉 다음은 컴파일되지 않아요.
TTest = record
Test: Integer;
end;
TTestHelper = record helper for TTest
property AccessTest: Integer read Test;
end;
- 레코드 헬퍼는 (가시성 지정자가 있는 확장 레코드를 사용할 경우) public 필드만 접근할 수 있어요.
- 레코드 헬퍼의 상속은 ObjFPC 모드에서만 허용돼요. Delphi 모드에서는 허용되지 않아요.
- 레코드 헬퍼는 다른 레코드 헬퍼에서만 하위로 파생될 수 있고, 클래스 헬퍼에서는 파생될 수 없어요.
- 클래스 헬퍼와 달리, 하위 레코드 헬퍼는 같은 레코드 타입을 확장해야 해요.
- Delphi 모드에서는
inherited로 확장 레코드의 메서드를 호출할 수 없어요. ObjFPC 모드에서는 가능해요. 다음 코드는 컴파일하려면 ObjFPC 모드가 필요해요.
type
TTest = record
function Test(aRecurse: Boolean): Integer;
end;
TTestHelper = record helper for TTest
function Test(aRecurse: Boolean): Integer;
end;
function TTest.Test(aRecurse: Boolean): Integer;
begin
Result := 1;
end;
function TTestHelper.Test(aRecurse: Boolean): Integer;
begin
if aRecurse then
Result := inherited Test(False)
else
Result := 2;
end;
핵심은 레코드 헬퍼가 클래스 헬퍼보다 제약이 더 많다는 거예요. 특히 헬퍼 선언 안에서는 확장 레코드의 멤버에 접근할 수 없다는 점과, inherited 호출이 ObjFPC 모드에서만 가능하다는 점을 기억하세요.
더 알아보기
- 클래스 헬퍼의 제약은 Restrictions on class helpers를 참고하세요
- 레코드 헬퍼의 기본 개념은 Definition에서 다뤄요
- 타입 헬퍼의 세부 사항은 Considerations for (simple) type helpers를 참고하세요