Destructor ها در پاسکال شیگرا

Destructor ها در پاسکال شیگرا
به متد ویژه ای که قبل از تخریب شی به صورت خودکار فراخوانی میشود Destructor میگویند
در حقیقت عملکرد Destructor عکس عملکرد Constructor است .
معمولا از ان برای آزاد کردن حافظه تخصیص یافته به کلاس یا انجام هر نوع عملیات پاکسازی استفاده میشود
یک کلاس نیازی به داشتن Destructor ندارند
به این دلیل که میتواند از Destructor مربوط به جد اصلی کلاس ها ( یعنی TObject ) استفاده کند
توجه داشته باشید که Destructor نیز همانند Constructor نمی تواند شامل مقدار بازگشتی باشد
یک کلاس میتواند شامل چندین Destructor باشد امل معمولا این چنین نخواهد بود
در صورتی که یک کلاس فقط شامل یک Destructor باید آن را با Destroy نام گذاری کند
حتما میپرسید چرا ؟ برای این که وقتی شما نمونه ای از یک کلاس را آزاد میکنید
( یعنی آن را از حافظه حذف میکنید )
از متد Free یکی از متدهای TObject است و قبل از تخریب شی متد Destroy فراخوانی میکند
توجه داشته باشید که این معمولا ترین روش آزاد کردن حافظه مربوط به اشیا است
برای مثال به کد زیر توجه کنید
Rect1 : = TMyRect.Create; {کارهایی را انجام داده و در نهایت حافظه را آزاد میکند} Rect1.Free;
حال کد مربوط به کلاس TMyRect را تغییر می دهیم
TMyRect = class private Left : Integer; Top : Integer; Right : Integer; Bottom : Integer; public function GetWidth : Integer; function GetHeight : Integer; procedure SetRect(ALeft, Atop, ARight, ABottom : Integer); constructor Create; constructor CreateVal(ALeft, Atop, ARight, ABottom : Integer); destructor Destroy;override; end; constructor TMyRect.Creat; begin inherited Create; {تخصیص حافظه برای رشته مختوم به تهی} Text : = AllocMem(1024); end; destructor TMyRect.Destroy; bigen {آزاد نمودن حافظه تخصیص یافته} FreeMem(Text); inheried Destroy; end;
همان طور که مشاهده میکنید
نسخه جدید کلاس TMyRect درون Constructor خود اقدام به تخصیص حافظه
برای یک رشته مختوم به تهی با نام Text کرده است
و سپس درون Destructor اقدام به آزاد کردن حافظه Text نموده است
بهتر است نگاهی عمیقتر به تعریف Destructor مربوط به کلاس قبلی داشته باشیم
نکـــــته |
---|
معمولا عبارت مربوط به inherited اولین عبارت درون Constructor و آخرین عبارت درون Destructor خواهد بود |