2015-01-06 6 views
2

TVirtualMethodInterceptor.Create doesn't support the class that has overload virtual method.과 관련이 있습니다. RRUZ의 대답을 수정 한 후에 또 다른 문제가 발생했습니다. 두 번째 오버로드 메서드를 어떻게 호출해야합니까? SaveLog (str : string; Args : TConst의 배열); " . 아래와 같이 코드 RTTI 및 변형 개방형 배열 매개 변수

type 

    TConst = array of TVarRec; 

    TLog = class 
    public 
    constructor Create(); 

    procedure SaveLog(str: string); overload; virtual; 
    procedure SaveLog(str: string; Args: TConst); overload; virtual; 
    end; 

constructor TLog.Create(str: string); 
begin 

end; 

procedure TLog.SaveLog(str: string); 
begin 
    MessageBox(GetFocus(), PChar(str), 'Test Message', MB_OK); 
end; 

procedure TLog.SaveLog(str: string; Args: TConst); 
var 
    buf: string; 

begin 
    buf:=Format(str, Args); 
    SaveLog(buf); 
end; 


procedure MyTest(nID: Integer); 
var 
    ttt: TLog; 
    vmi: TVirtualMethodInterceptor; 

begin 
    ttt:=TLog.Create(); 
    try 
    ttt.SaveLog('ID = %d', [nID]); 
    vmi:=TVirtualMethodInterceptor.Create(ttt.ClassType); 
    try 
     // 
    finally 
     vmi.Free(); 
    end; 
    finally 
    ttt.Free(); 
    end; 
end; 

코드 "ttt.SaveLog ("ID = % d의 '[NID])는 「얻을 컴파일러 에러 : E2250 될 수'SaveLog '아니오 오버로딩 없다 이 주장들로 불렀습니다. 어떻게해야합니까?

답변

1

Args 매개 변수는 동적 배열입니다. 동적 배열을 만들고 채 웁니다.

오픈 배열 생성자를 전달하려고 시도하여 코드를 컴파일 할 수 없습니다. 오픈 어레이가있는 경우 유효하지만 그렇지 않은 경우 유효합니다. 동적 배열이 있습니다.

유용한 유용한 트릭 중 하나는 가변 개방 배열을 허용하고 동적 배열을 반환하는 함수를 정의하는 것입니다. 그런 다음 하나를 다른 인라인에 적용 할 수 있습니다. 이 함수는 다음과 같이 선언 할 것이다 : 나는 당신의 TConst 대신 일반 동적 배열 TArray<T>를 사용하는 선호하고

function VariantOpenArrayToDynArray(const Args: array of const): TArray<TVarRec>; 

참고. 이렇게하면 더 나은 형식 호환성을 얻을 수 있습니다.

Rudy Velthuis가 이에 대해 자세히 다루고이 기사에서 어댑터 기능을 구현하는 방법을 보여줍니다. Open array parameters and array of const.


즉, TVarRec은 명시 적으로 사용하도록 설계되지 않았습니다. Variant Open Array에 대한 런타임 지원입니다. Rudy의 기사에서 알 수 있듯이 가변 개방형 배열에 대한 컴파일러 지원의 안전한 경계를 벗어나면 명시적인 메모리 관리가 필요합니다. TArray<TVarRec>의 사용을 권장하지 않습니다.

대신 최신 스타일 RTTI와 함께 사용하도록 설계된 최신 변형 유형을 사용하는 것이 좋습니다. 즉, TValue입니다. 이 변형 유형은 명시 적 사용을 위해 설계되었으며 메모리 관리는 자동으로 수행됩니다. TArray<TVarRec> 대신 TArray<TValue>을 사용하십시오.

+3

@AndersenChang : 또한 [TConst] 유형과 열기의 차이점을 읽으려면 [Open 배열 매개 변수 및 배열 배열] (http://rvelthuis.de/articles/articles-openarr.html)을 읽어보십시오. 배열. 그것들은 관련이 있지만 동일하지는 않습니다. –

+0

그건 @Rudy가 제공 한 선언문을 구현하는 방법을 보여주는 훌륭한 링크입니다. –

+0

@Andersen TVarRec의 값으로 저장되지 않은 데이터 유형보다 복잡합니다. Rudy의 기사를 참조하십시오. –