کلمه کلیدی final در شی گرایی
کلمه ی کلیدی final برای محدود کردن تغییر متدهای کلاس توسط کلاس های فرزند استفاده می شود.
کلمه کلیدی final چه کار می کند؟
فرض کنید ما یک کلاس تعریف کردیم که دارای یک متد است:
class Biawp { function show_url() { return 'Biawp.ir'; } }
سپس یک subclass از آن بسازیم و در آن متد show_url را override کنیم:
class Plugin extends Biawp { function show_url() { return 'Www.biawp.ir'; } }
اما گاهی اوقات متدهای ما حساس هستند و قصد نداریم هیچ subclass ای آنها را override کند.
در اینصورت کلاس اصلی را final می کنیم و نمی گذاریم هیچ کلاسی از کلاس ما ارث بری کند:
final class Biawp { function show_url() { return 'Biawp.ir'; } } class Plugin extends Biawp { function show_url() { return 'Www.biawp.ir'; } } //output: Class Plugin may not inherit from final class
مشاهده می کنید که چون کلاس Biawp دارای کلمه کلیدی final است، پس هنگامی که کلاس Plugin را از آن extend کردیم، خطا تولید می شود و می گوید که شما نمی توانید از یک کلاس final ارث بری کنید.
پس اکنون این اطمینان ایجاد شده است که هیچ subclass ای نمی تواند کلاس ما را تغییر دهد.
متد final در شی گرایی
همانطور که دیدیم، کلمه کلیدی final زمانی که در تعریف کلاس بیاید، جلوی extend شدن آن را می گیرد.
ولی گاهی اوقات نیاز نداریم کل کلاس را محدود کنیم.
مثلا از کل کلاس Biawp در مثال بالا، فقط قصد داریم متد show_url محافظت شده و توسط هیچ subclass ای امکان override شدن نداشته باشد.
در اینصورت کافیست کلمه کلیدی final را همراه متد بیاوریم.
اکنون می توانیم هم کلاس را extend کنیم و هم امکان override شدن متد مدنظرمان وجود نداشته باشد:
class Biawp { final function show_url() { return 'Biawp.ir'; } } class Plugin extends Biawp { function show_url() { return 'Www.biawp.ir'; } } //output: Cannot override final method Biawp::show_url()