뭔가를 달성하기 위해 두 가지 방법이 있습니다 유사한, 필요에 따라 :
첫 번째 방법은 (해당 마무리에 인스턴스를 해제 기억 중 하나 단위 초기화 절차에 클래스의 인스턴스를 초기화하는 것을 포함 절차) 또는 처음 액세스에서 인스턴스 초기화하기 위해 접근 장치의 기능을 사용하여 :
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);
편집기에서 101010 버튼을 사용하여 텍스트를 코드로 포맷 할 수 있습니다. – itowlson
그런 버튼을 보지 못했다 !!? 그것은 무엇입니까? – user235720
편집 툴바의 다섯 번째 버튼입니다. –