2012-06-18 7 views
6

딥 클래스 계층 구조의 기본 클래스에 클래스 변수를 추가했습니다. 클래스 유형마다 생성 된 인스턴스의 수를 세는 정수입니다. 하지만 문제가 생겼어. Delphi 클래스 당 클래스 변수

TBaseClass = class 
    private 
    class var fCreated: integer; 
    public 
    class function NewInstance: TObject; override; 
    end; 

    TDescendant = class(TBaseClass) 
    end; 

    ... 

    class function TBaseClass.NewInstance: TObject; 
    begin 
    result := inherited NewInstance; 
    inc(fCreated); 
    end; 

은 내가 클래스 당 을 만든 인스턴스의 수를 저장하는 클래스 VAR를 사용할 수 있다고 가정하지만,이 경우 될 것 같지 않습니다

는 예를 감안할.

TBaseClass.fCreated을 검사하면 TDescendant.fCreated과 같은 값이 반환되고 inspector를 통해 값을 변경하면 다른 값이 변경되므로 fCreated이 하나의 전역 변수 인 것처럼 동작합니다.

fCreated이 클래스 유형마다 유지 관리 될 것으로 예상됩니까? 내가 뭘 놓치고 있니?

답변

8

누락 된 자료가 없습니다. 클래스 변수가 어떻게 작동하는지에 대한 분석은 정확합니다. 클래스 var는 클래스에 의해 범위가 지정된 전역 변수에 지나지 않습니다.

간단한 해결책은 사전을 사용하여 인스턴스를 계산하는 것입니다. 좀 더 해킹 된 접근법은 Hallvard Vassbotn이 블로그에 올린 트릭을 사용하는 것인데, (ab)는 VMT를 사용하여 클래스 관련 필드를 저장합니다. 당신은 그것에 대해 모두 here을 읽을 수 있습니다.

+0

동일한 댓글이 이미 여기에 표시되었습니다. http://stackoverflow.com/a/72496/12170 – PatrickvL

+0

Hacky하지만 내가 원하는 것을 수행합니다. –

관련 문제