2013-07-12 5 views
2

더 나은 코드 가독성을 위해 사용자 지정 데이터 형식을 선언하고 싶습니다. 이 유형을 다른 AnsiString과의 간섭으로부터 깨끗하게 유지할 수 있습니다. 그러나 델파이는 그것을 지원하지 않는 것 같습니다.Delphi에서 사용자 정의 유형을 선언하는 방법은 무엇입니까?

type 
    TKMLocaleCode = type AnsiString; 

... snip ... 

procedure A; 
var 
    A,B: TKMLocaleCode; 
    C: AnsiString; 
begin 
    A := 'eng'; //<<-- I expect an error here 
    A := C; //<<-- I expect an error here too 

    B := TKMLocaleCode('eng'); //<<-- I expect no error here 
end; 

델파이에서 사용자 정의 유형을 선언 할 수 있습니까?

+0

** ** ** AnsiString? 나는 그것이 유효한 선언이라고 생각하지 않습니다. –

+1

@RobKennedy 이전에'AnsiString'의 유형을 본적이 없었 습니다만, 비교가 생략되어 컴파일되기 때문에 관심사가 무엇일까요? 디버거는 실제로 분석에 도움이되지 않습니다 ... – bummi

답변

8

어쨌든 어디에서나 오류가 발생해서는 안되지만 초기 기법으로는 목표를 달성하지 못할 것입니다. TFileName은 귀하의 것과 똑같은 별개의 문자열 유형이지만, 일반 문자열이 예상되는 곳이면 어디서든 사용할 수 있습니다. type 선언은 디자인 타임에 다양한 종류의 속성 편집기에 사용할 수 있도록 형식에 대해 서로 다른 RTTI를 설정하는 데 더 중요합니다.

정말로 고유 한 유형을 작성하려면 데이터를 보유 할 필드가있는 레코드를 선언하십시오. 레코드는 다른 유형과 동일한 구조를 가지고 있더라도 다른 것과 호환되지 않습니다. 레코드를 같은 유형의 다른 값과 비교할 수있게하려면 레코드 선언에 EqualNotEqual 메소드를 제공하여 비교 연산자에 오버로드하십시오. 유형 지정을 통해 구별 유형을 작성할 수는 있지만 보통 지정을 사용하지 않으려면 Explicit 연산자를 제공하고 Implicit은 제공하지 마십시오.

4

당신은 기록을 선언 할 수 있습니다 다음은 지원하고자하는 중 운영자 공급하기 위해 오버로드 연산자를 사용

type 
    TKMLocaleCode = record 
    strict private 
    FValue: AnsiString; 
    public 
    class operator Explicit(const Value: string): TKMLocaleCode; 
    end; 

class operator TKMLocaleCode.Explicit(const Value: AnsiString): TKMLocaleCode; 
begin 
    Result.FValue := Value; 
end; 

은 분명히 당신이 더 많은 기능을 추가 할 수 있습니다,하지만이 기록은 질문에 명시된 요구 사항을 충족 .

+0

훌륭한 제안, 동정 나는 대답으로 둘 다 표시 할 수 없습니다 .. – Kromster

관련 문제