آموزش پاسکال شی‌گرا

اشاره‌گر 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 دارای کاربردهای دیگری نیز می باشد
که در پست های آینده مورد تشریح قرار خواهد گرفت

[adinserter block="1"]
5/5 - (1 امتیاز)

نوشته های مشابه

دیدگاهتان را بنویسید

دکمه بازگشت به بالا