delphi 확인하십시오 상호 종속 레코드에 대해 암시 적 변환 연산자를 정의하려면 어떻게합니까?




형변환 비용 (2)

레코드 도우미와 함께이 작업을 수행 할 수 있습니다 .

아래는 제가 최근에 forward record 레코드 선언을 할 수 없다는 것을 해결하기 위해 최근에 한 일입니다.

implicit type casts 처럼 record helper 구조를 사용합니다. 단점도 있습니다.
가장 중요한 것은 특정 record 유형에 가장 가까운 record helper 만 적용된다는 것입니다.

type
  TIpv4Address = record
  strict private
    FAddress: TIpv4Quad;
    FMask: TIpv4Quad;
  private
    class function CreateInternal(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4Address; static;
  public
    class function Create(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4Address; static;
    class function Count(const IP_ADDR_STRING: _IP_ADDR_STRING): Integer; static;
    property Address: TIpv4Quad read FAddress;
    property Mask: TIpv4Quad read FMask;
  end;

  TIpv4AddressList = array of TIpv4Address;

  TIpv4AddressHelper = record helper for TIpv4Address
    class function CreateList(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4AddressList; static;
  end;

다음과 같이 사용하십시오.

function TAdapterInfo.GetIpAddressList: TIpv4AddressList;
begin
  Result := TIpv4Address.CreateList(AdapterInfos.IP_ADAPTER_INFO[Index].IpAddressList);
end;

- 제로 인

Delphi 2006에서 레코드에 대한 연산자 오버로딩을 사용하고 있습니다. (이 질문에 대답하지 말라고 대답하지 마십시오.)

암시 적 연산자가 오버로드 된 두 개의 레코드 유형이 있습니다. 그것들은 모듈을 구현할 때만 존재하며 인터페이스를 통해 노출되지 않습니다.

내 문제는, 그들이 상호 의존적 이니까, 컴파일러에 두 번째 타입을 선언하는 방법을 모른다. 함수, 프로 시저 및 클래스로이 작업을 수행하는 방법을 알고 있지만 레코드로는 알지 못합니다.

다음은 내가하려는 일의 단순화 된 예입니다.

implementation

type
  TMyRec1 = record
    Field1 : Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;  // <---- Undeclared Identifier here.
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;

class operator TMyRec1.Implicit(a:TMyRec2): TMyRec1;
begin
  Result.Field1 := a.Field2;
end;

class operator TMyRec2.Implicit(a:TMyRec2): TMyRec2;
begin
  Result.Field2 := a.Field1;
end;

레코드 유형에 대해 선언을 전달할 수 없습니다. 두 번째 형식의 Implicit 연산자를 모두 정의합니다.

type
  TMyRec1 = record
    Field1 : Integer;
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;

도움말 에서 인용 :

암시 적 전환은 절대적으로 필요한 곳에서만 제공되어야하며 반사는 피해야합니다. B 형을 암시 적으로 A 형으로 변환하고 A 형을 B 형에 대해 알지 못하게하는 것이 가장 좋습니다 (또는 그 반대).





delphi-2006