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

متد Overriding در پاسکال شی‌گرا

متد Overriding در پاسکال شی‌گرا

حتما در پست های قبلی با دیدن کلمات کلیدی Virtual و Override متعجب شده
و مفهوم آنها را متوجه نشده اید
چرا در این پست به سادگی مفهوم آنها را خواهید یافت

کلمه Virtual  درلغت به معنای مجازی است
در حقیقت در برنامه نویسی شی‌گرا متد Virtual به متدی اطلاق میشود
که کد آن در کلاس های منشعب شده قابل جای گزینی باشد
برای مثال اگر به تعریف کلاس TCar نگاهی بیندازید
خواهید دید که متد StopEngine را مجددا پیاده سازی کنند
کلمه Override در لغت به معنای کنار گذاشتن است
در برنامه نویسی شی‌گرا به کنار گذاشتن متد کلاس پایه و پیاده‌سازی مجدد آن اصطلاحا Method Override میگویند
برای مثال اگر به تعریف کلاس TPekan نگاهی بیندازید
خواهید دید که که متد StopEngine مجددا پیاده سازی شده است

نکـــــــته
اگر پیاده سازی متد کلاس پایه را در کلاس منشعب شده جایگزینی کنید
به این عمل Method Override می گویند

توجه داشته باشید که برای Override کردن یک متد باید نام پارامترها و نوع بازگشتی آن دقیقا مشابه با کلاس پیاه بود
و هم چنین کامه کلیدی Override نیز استفاده کنید
در حقیقت شما قادر به تغییر دادن کد درون بلوک  متد خواهید بود
که در حقیقت پیاده سازی متد را شامل میشود

در حقیقت با استفاده از Method Override  شما قادر به انجام دو کار خواهید بود
اول این که میتوانید پیاده سازی مربوط به کلاس را به طور کامل کنار گذاشته و پیاده سازی جدید را انجام دهید

procedure TPeykan.StopEngine;
begin
{کد جدید را در این قسمت قرار خواهید داد}
end;

دوم این که میتوانید از پیاده سازی مربوط به کلاس پایه استفاده کرده و آن را گسترش دهید
تعجب نکنید ! شما میتوانید با استفاده از کلمه کلیدی inherited اقدام به فراخوانی متد کلاس پیاه کرده
و سپس کد جدیدی را نیز به آن اضافه کنید

procedure TPekan.StopEngine;
begin
 {ابتدامتد کلاس پیاه فراخوانی میگردد}
 inherited StopEngine;
 
 {کد جدید را در این قسمت قرار خواهید داد}
end;

در حقیقت با فراخوانی متد کلاس پایه کد مربوط به متد کلاس پیاه اجرا شده و شما به عملکرد اصلی متد دسترسی پیدا خواهید کرد
توجه داشته باشید که شما میتوانید فراخوانی متد کلاس پیاه را قبل از کد جدید یا بعد از آن قرار داده و به این طریق عملکرد متد را گسترش دهید
اشاره به این نکته ضروری است که متد StopEngine در بخش Protected مربوط به کلاس  TCar تعریف شده است
و اگر دربخش Private تعریف شده بود شما قادر به انجام این عمل نبودید
در حقیقت با قرار گرفتن متد StopEngine در بخش Protected این متد از دید کاربران کلاس پنهان است
اما برای کلاس های منشعب شده استفاده می‌شود

نکـــــــته
شاید اگر به توضیحات مربوط به سطح دسترسی کلاس مراجعه کنید
کمی متعجب شوید ! در حقیقت در مورد سطح دسترسی یک استثنا وجود دارد
اگر یک کلاس منشعب شده را درون یونیتی تعریف کنید
که کلاس پیاه نیز در آن یونیت تعریف شده باشد
موارد Private مربوط به کلاس پیاه برای کلاس منشعب شده حکم Protected  را خواهد داشت
و قابل دسترس خواهند بود اما اگر کلاس منشعب شده
درون یونیت دیگری تعریف شود به وارد Private مربوط به کلاس پیاه دسترسی نخواهد داشت

زمانی که شما یک کلاس را از کلاس دیگری منشعب میکنید
باید دقت داشته باشید که constructor کلاس پایه را فراخوانی کنید
برای این منظور نیز باید از کامه کلیدی inherited استفاده کنید
برای مثال نگاهی به constructor مربوط به کلاس TCar می‌اندازیم

constructor TCar.Create;
begin
 inherited Create;
 Started := False;
 Speed   :0;
end;

در حقیت با فراخوانی constructor کلاس پیاه مطمئن میشود که کلاس به درستی ایجاد شودشاید تعجب کرده و می گویید
که کلاس TCar از هیچ کلاسی منشعب نشده است
اگر چنین تصوری داشته اید برای شما متاسفم در صورتی که هنگام تعریف یک کلاس هیچ کلاس پایه ای را مشخص نکنید
کلاس پایه به صورت خودکار TObject خواهد بود

در شکل زیر نمای بسیار ساده‌ای ازسلسه مراتب وراثت در VCL (کتابخانه اجزای بصری) ارایه شده است

همان طور که مشاهده میشود از TObject منشعب شده است
و اشیای زیادی نیز از TComponent منشعب شده‌اند
در حقیقت اگر به اجزایی که درون پلت اجزا Component  قرار دارند نگاهی بیندازدی متوجه خواهید شد
که همگی از TComponent  منشعب شده اند
به اشیایی که از TControl منشعب شده اند کنترل گفته میشود و دارای این خاصیت هستند که در زمان اجرا روی صفحه نمایش ظاهر خواهند شد
برای مثال جز Button یک کنترل است و کلیه قابلیت های TObject  و TComponent  و TControl  را به ارث برده
و قابلیت های خاص خود را نیز له آنها افزوده است
با ارایه توضیحات فوق حتما متوجه شده اید که تمامی اشیا از کلاس TObject منشعب میشوند
TObject  یک کلاس است و متدهای اساسی مربوط به ایجاد و تخریب اشیا را شامل میشود

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

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

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

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