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

اشارهگر Self در پاسکال شیگرا
تمامی کلاس ها شامل یک فیلدمخفی با نام Self هستند
در حقیقت Self اشارهگری به نمونه کلاس در حافظه است تعجب کرده اید؟!
برای این که تعجب شما برطرف شود باید کمی توضیح دهم
در صورتی که فیلد Self مخفی نباشد کلاس TMyRect به صورت زیر خواهد بود
TMyRect = class private Self : TMyRect; Left : Integer; Top : Integer; Right : Integer; Bottom : Integer; public function GetWidh : integer; function GetHeight : integer; procedure SetRect(ALeft, ATop, ARight, ABottom : integer); constructor Create; constructor CreateVal(ALeft, ATop, ARight, ABottom : integer); destructor Destroy;override; end;
زمانی که نمونه ای از یک کلاس ساخته میشود
اشارهگر self به صورت خودکار با آدرس حافظه شی مقداردهی اولیه میشود
Rect := TMyRect.CreatVal(0, 0, 100 ,100); // Rect.Self = Rect اکنون
حتما باز تعجب کرده و می پرسید که اشارهگر Self چه کاربردی دارد؟!
برا این که پاسخ شما را داده باشم باید توجه داشته باشید
که هر نمونه ای از کلاس شامل کپی اختصاصی از فیلد های کلاس است
اما تمامی نمونه های کلاس از مجموعه مندهای یکسانی به صورت اشتراکی استفاده میکنند
و دلیلی هم وجود ندارد که متدها برای هر نمونه از کلاس به صورت مجزا به وجود آیند و حافظه را بیهوده ازبین ببرند
حال تصور کنید که کامپایلرچگونه باید تشخیص بدهد که کدام نمونه اقدام به فراخوانی متد کرده است ؟!
در حقیقت تمامی متدهای کلاس یک پارامتر مخفی با نام self هستند
برای مثال اگر کلاس TMyRect شامل تابعی با نام GetWidth باشد
پیاده سازی ان میتواند مشابه کد زیر باشد
function TMyRect.GetWidth; begin Result := Right -Left; end;
توجه داشته باشید که تابع فوق برای کامپایلر به شکل زیرخواهد بود
function TMyRect.GetWidth; begin Result := Self.Right - Self.Left; end;
اکنون با کمی دقت پی میبرید کامپایلر با استفاده از متغییر self متوجه میشود
که کدام نمونه متد را فراخوانی کرده است
و لذا میتواند تشخیص دهد که فیلد داده ای کدام نمونه باید مورد دسترسی قرار گیرد
نکـــــــته |
---|
هرگز اشارهگر self راتغییر ندهید شما میتوانید از self برای ارسال پارامتر به متدها استفاده کنید اما نباید ان را تغییر دهید |
در حقیقت self یک متغییر است که شما میتوایند از طریق کلاس به آن دسترسی پیدا کنید
توجه داشته باشید که self دارای کاربردهای دیگری نیز می باشد
که در پست های آینده مورد تشریح قرار خواهد گرفت