แนวคิดที่อยู่เบื้องหลังหน่วยนี้คือวงจรชีวิตที่คล้ายกันเพื่ออ้างอิงวัตถุที่นับใน Delphi ตามที่อ่อนแอใน. NET
การอ้างอิงวัตถุที่นับใน Delphi มีข้อ จำกัด บางประการเมื่อพูดถึงการอ้างอิงแบบวงกลมซึ่งตัวอย่างเช่นการอ้างอิง tparent เป็นเด็ก (ผ่าน ichild) และ tchild อ้างอิงถึงผู้ปกครอง (ผ่าน iparent) หากเราลบการอ้างอิงภายนอกใด ๆ ไปยังอินสแตนซ์ iparent และ ichild ของเราโดยไม่ต้องให้เด็กลบการอ้างอิงถึง iParent เราจะจบลงด้วยวัตถุกำพร้า นี่เป็นเพราะอินสแตนซ์ ichild และ iParent ของเรากำลังอ้างอิงซึ่งกันและกันและทำให้พวกเขาไม่เคยได้รับการปล่อยตัว
ชั้นเรียนที่สามารถอ้างอิงได้อย่างอ่อนแอจำเป็นต้องลงมาจาก TWeakReferencedObject
type
TParent = class(TWeakReferencedObject, IParent)
...
end;
TChild = class(TInterfacedObject, IChild)
private
FParent : IWeakReference<IParent>;
protected
procedure SetParent(const parent : IParent);
function GetParent : IParent;
public
property Parent : IParent read GetParent write SetParent;
end;
implementation
procedure TChild.SetParent(const parent : IParent);
begin
if parent <> nil then
FParent := TWeakReference<IParent>.Create(parent)
else
FParent := nil;
end;
function TChild.GetParent : IParent;
begin
result := nil
if (FParent <> nil) and FParent.IsAlive then
result := FParent.Data;
end;
ในตัวอย่างข้างต้นหากวัตถุหลักถูกทำลายก่อนเด็กการอ้างอิงที่อ่อนแอในวัตถุเด็กจะถูกทำเครื่องหมายว่าไม่มี (ดังนั้น. isalive ส่งคืนเท็จ)