2009-12-21 3 views
2

레코드를 정의하면 해당 레코드의 인스턴스를 상수 레코드으로 정의 할 수 있습니다.상수 클래스 인스턴스

Tunit = record 
    _name: string; 
    _scale: real; 
end; 

const metre: Tunit = 
    (_name: 'metre'; 
    _scale: 1.0; 
) 

나는 TUNIT는 클래스이며, m은 클래스의 인스턴스이지만, 그 관련 분야 다른 코드에 의해 변경 될 수없는 (특히) 인스턴스 인 경우에 비슷한 일을 할 필요가있다. 이것을 달성하는 방법을 볼 수 없습니다. 어떤 아이디어라도 제발?

+0

편집기에서 101010 버튼을 사용하여 텍스트를 코드로 포맷 할 수 있습니다. – itowlson

+0

그런 버튼을 보지 못했다 !!? 그것은 무엇입니까? – user235720

+0

편집 툴바의 다섯 번째 버튼입니다. –

답변

4

뭔가를 달성하기 위해 두 가지 방법이 있습니다 유사한, 필요에 따라 :

첫 번째 방법은 (해당 마무리에 인스턴스를 해제 기억 중 하나 단위 초기화 절차에 클래스의 인스턴스를 초기화하는 것을 포함 절차) 또는 처음 액세스에서 인스턴스 초기화하기 위해 접근 장치의 기능을 사용하여 :

A)

interface 

    var 
    metre : TUnit = NIL; // Can initialise a unit variable 

    : 

    implementation 

    : 

    initialization 
    metre := TUnit.Create(...); 

    finalization 
    FreeAndNIL(metre); 

    end. 

참고 : 당신의 CLA를하는 경우 당신의 질문에 나타난 것처럼 데이터의 컨테이너 일뿐입니다. 결론은 생략합니다. Free'ing - 기술적 인 메모리 누수가 있지만 실제로 인스턴스에 사용 된 메모리가 누출되지는 않을 것입니다. 프로세스가 종료됩니다. 완료시 Free가 실행되면 프로젝트의 다른 종료 코드가 free'd 후에 meter 인스턴스에 액세스하면 문제가 발생할 수 있습니다.

소위 "싱글 톤"클래스를 사용하지 않으려 고 조심하십시오. 이러한 단순한 경우에는 복잡성과 오버 헤드가 없으므로 이익을 얻지 못합니다. 마무리의 선택성 w.r.t

b)

interface 

    function Metre: TUnit; 

    implementation 

    var 
    _metre : TUnit = NIL; // Can initialise a unit variable 


    function Metre: TUnit; 
    begin 
    if NOT Assigned(_metre) then 
     _metre := TUnit.Create(...); 

    result := _metre; 
    end; 


    finalization 
    FreeAndNIL(metre); 

    end. 

동일한 관찰이 경우에도 적용된다.

성능이 중요한 관심사이고이 접근 함수가 많이 사용되는 경우 초기에 팩토리 함수로 초기화 된 함수 포인터를 사용하여이 영역을 최적화하는 추가 단계를 수행 할 수 있습니다. 첫 번째 액세스시 단순한 무조건 액세스 함수에 대한 포인터

두 번째 방법은 멤버 함수를 사용하는 대신 클래스 함수를 사용하여 특수 파생 클래스에서 고정 값을 반환하는 것입니다. 클래스를 인스턴스화 할 필요가 없으므로 클래스를 처리하는 것에 대해 걱정할 필요가 없습니다. Delphi 2010이 클래스 함수뿐만 아니라 클래스 변수도 지원하는 경우 내 머리 꼭대기를 기억할 수 없습니다. 그렇다면 대답도 될 수 있습니다. 그러나 만약 당신이 델파이 2010을 사용하지 않는다면 질문은 어쨌든 논리적이지 않을 것입니다.

이 같은 작은 선물을 보일 것이다

TMetre = class(TUnit) 
    class function Name: String; override; 
    class function Scale: Double; override; 
end; 

난 당신이 표준 변환 장치와 측정 기능의 관련 단위 알고 있습니다 ...하지만 궁금합니까? 이 질문의 내용이 Delphi RTL의 기존 측면에 이미 제시되어있는 것처럼 보일뿐입니다.이 상수 객체 값을 만들 기술적으로 가능할 것이다 동안

interface 
type 
    TUnit = class 
    private 
    _name: string; 
    _scale: real; 
    class function makeunit(aname: string; ascale: real): TUnit; 
    public 
    property name: string read _name; 
    property scale: real read _scale; 
    end; 

function metre: TUnit; 

implementation 

var 
    _metre : TUnit = nil; 

class function TUnit.makeunit(aname: string; ascale: real): Tunit; 
begin 
    Result._name := aname; 
    Result._scale := ascale; 
end; 

function Metre: TUnit; 
begin 
    if not Assigned(_metre) then 
    _metre := TUnit.makeunit('metre', 1.0); 
    result := _metre; 
end; 

finalization 
    FreeAndNIL(_metre); 
+0

그 모든 것에 대해 많은 감사드립니다 - 매우 도움이됩니다. 다시 말하면, 나는 그것을 막연하게 알았지 만, 단위 대 변환에 ​​관심이있는 것보다 온톨로지를 여기에서 스케치하고 있습니다. 그들은 온톨로지 요구 사항의 일부로 나타납니다. – user235720

4

는 읽기 전용 속성을보십시오.

+0

감사합니다 - 읽기 전용 요구 사항을 처리하는 것 같습니다 t – user235720

0

가, 그 개념은 일반 메모리 해제 방법과 호환되지 않는 것, 그리고 델파이/출신를 지원하지 않습니다