متد 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 یک کلاس است و متدهای اساسی مربوط به ایجاد و تخریب اشیا را شامل میشود