(단순) 타입 헬퍼의 고려 사항 — 지원 타입과 모드

(단순) 타입 헬퍼의 고려 사항 — 지원 타입과 모드

단순 타입의 경우 규칙은 레코드와 거의 같고, 몇 가지 추가 요구 사항이 있어요.

출처: Considerations for (simple) type helpers — Free Pascal Reference

본문

  • 타입 헬퍼 지원은 typehelpers 모드 스위치로 활성화해야 해요.
{$modeswitch typehelpers}

이 모드 스위치는 Delphi와 DelphiUnicode 모드에서만 기본으로 켜져 있어요.

  • Delphi(및 DelphiUnicode) 모드에서는 더 엄격한 Delphi 호환을 위해 타입 헬퍼 대신 레코드 헬퍼를 사용해야 해요.
  • ObjFPC와 MacPas 모드는 타입 헬퍼를 사용하지만 TypeHelpers 모드 스위치를 사용해야 해요.
  • 다음 타입은 지원되지 않아요.
    • 모든 파일 타입(Text, file of ...)
    • 프로시저 변수
    • 레코드, 클래스, Objective C 클래스, C++ 클래스, 객체, 인터페이스 같은 타입도 금지돼요. 클래스에는 클래스 헬퍼를 사용해야 해요. 예를 들어 다음은 실패해요.
TTestHelper = type helper for TObject
end;

물론 이는 다른 모든 단순 타입이 지원된다는 뜻이에요.

  • 타입 헬퍼는 생성자를 구현할 수 있어요.
  • 레코드 헬퍼의 상속은 ObjFPC 모드에서만 허용돼요. Delphi 모드에서는 허용되지 않아요.
  • 타입 헬퍼는 다른 타입 헬퍼에서만 하위로 파생될 수 있고, 클래스나 레코드 헬퍼에서는 파생될 수 없어요.
  • 하위 타입 헬퍼는 같은 타입을 확장해야 해요.

다음은 가능성을 보여주는 예시예요.

{$mode objfpc}
{$modeswitch typehelpers}

type
 TLongIntHelper = type helper for LongInt
   constructor create(AValue: LongInt);
   class procedure Test; static;
   procedure DoPrint;
 end;

constructor TLongIntHelper.create(AValue: LongInt);

begin
 Self:=Avalue;
 DoPrint;
end;

class procedure TLongIntHelper.Test;

begin
   Writeln('Test');
end;

procedure TLongIntHelper.DoPrint;

begin
   Writeln('Value :',Self);
end;

var
 i: LongInt;
begin
 I:=123;
 i.Test;
 $12345678.Test;
 LongInt.Test;
 I:=123;
 i.DoPrint;
 $12345678.DoPrint;
end.

핵심은 타입 헬퍼가 단순 타입(정수, 상수 리터럴, 심지어 타입 이름 자체)에도 메서드를 붙일 수 있게 해준다는 거예요. 이 예제에서 i.Test, $12345678.Test, LongInt.Test처럼 값, 리터럴, 타입 이름 모두에서 클래스 메서드를 호출하고, 인스턴스 메서드(DoPrint)도 값에서 호출해요.

더 알아보기