2011-12-09 4 views
4

내가하려는 일이 가능하다면 무엇보다 먼저 알아야합니다. 가능하다면 어떻게해야하는지 알 필요가 있습니다."강화 된 레코드"를 일반 "데이터 유형"변수에 할당 할 때 어떤 연산자를 오버로드합니까?

그것은 문제를 보여보다는 그래서 여기에 그것을 설명하기 위해 훨씬 쉽게 간다 :

나는이에 "향상된 기록"(목적 -이 질문에 중요하지는하지만 - "스마트 문자열"유형을 생산하는 것입니다) 일반 문자열 유형을 대체하는 다음과 같이

TLKString = record 
    Value: String; 
    // Some methods here to operate on and build String values 

    // Allows me to assign String values directly to "instances" 
    // of this record type! I have others (hence "overload") to 
    // handle other data types (such as Integer etc.) 
    class operator Implicit(const AValue: String): TLKString; overload; 
end; 

내가 지금이 TLKString 유형을 사용할 수 있습니다 :

var 
    LSmartString: TLKString; 
begin 
    LSmartString := 'Hello World'; // The "Implicit" operator then 
           // assigns this to LSmartString.Value 
end; 

좋아, 지금까지 모든 중대하다

! 이제 우리는

var 
    LSmartString: TLKString; 
    LNormalString: String; 
begin 
    LSmartString := 'Hello World'; 

    // The next line works fine, but is not what I want! 
    LNormalString := LSmartString.Value; 
    LNormalString := LSmartString; // E2010 (Incompatible Types) 
end; 

이것은 어디 ...

나는 일반 문자열 변수 (TLKString의 "예") LSmartString의 값을 할당 할 수 있어야합니다 ... 문제에 도착 위의 snip 결과의 마지막 줄은 E2010 호환되지 않는 유형 인 '문자열'과 'TLKString'입니다. 물론 TLKString 레코드 유형에서 연산자를 오버로드하여 극복하는 것이 가능한지 잘 모르는 경우, 그렇다면 어떤 연산자로 오버라이드해야합니까?

이 가능하지 않다면, 그것은 향상된 기록 유형 값의 할당을 처리하는 ImplicitExplicit 연산자를 가지고 코드 기어와 엠바 카데 조금 바보 같은 날에 충돌 있지만 조작자가 반전 처리 없음.

답변

6

좋아, 나는 스스로에게 대답했다. 그리고 그것은 내가 "blindingly obvious"이라고 부르는 것이었다.

여기에 (다른 사람의 이익을 위해) 솔루션

TLKString = record 
    Value: String; 
    // Some methods here to operate on and build String values 
    class operator Implicit(const AValue: String): TLKString; overload; // handles String to TLKString assignment 
    class operator Implicit(const AValue: TLKString): String; overload; // handles TLKString to String assignment! THIS IS THE ANSWER! 
end; 
+0

자신의 대답을 받아주십시오입니다. 1. 그것은 좋은 것입니다. 2. 그것은 더 이상 하나가 필요로 보이지 않을 것입니다 :) –

+0

그것은 다른 날에 응답하도록 표시하지 않을 것입니다! 일부 스택 오버플로 제한 사항 – LaKraven