کلاسهای abstract
در اکثر زبان های شئ گرا وجود دارند. کلاسهایی هستند که قابل نمونه گیری نیستند ، و سایر کلاسها فقط میتوانند از آنها ارث بری کنند.
فرض کنید که شما یک کلاس animal
دارید و میخواهید همه حیوانات از آن کلاس یا شئ مشتق شوند ، خود کلاس animal
به تنهایی قابل نمونه گیری نیست. چون ما موجود حیون نداریم و مثلا گربه با به ارث بردن بخشی از ویژگی های حیوان به موجودیت میرسد . پس دلیل اینکه اسم این نوع کلاسها را abstract
گذاشته اند هم قابل درک هست.
کاربرد کلاسهای abstract
حتما الان این سوال براتون پیش اومده که ” چه کاریه از abstract استفاده کنیم ؟ کلاس معمولی درست میکنیم ، ازش ارثم میبریم 🙂 “
سوال به جایی هم هست ، در پروژه های بزرگ برای خوانایی برنامه از abstract
ها استفاده میکنند . شما وقتی یک کلاس abstract
رو میبینید، خیلی راحت میفهمید که این تابع قابل نمونه گیری نیست و یک کلاس برای ارث برده شدن هست. در پروژه های کوچیک این مسئله زیاد خودش رو نشون نمیده ولی در پروژه های بزرگ خیلی کاربرد داره. مثلا همین فریمورک لاراول خودمون خیلی جاها از همین نوع کلاسها استفاده کرده.
کاربرد دیگه ی کلاسهای abstract
این هست که شما با این نوع کلاسها میتونید نویسنده های کلاسهای فرزند رو وادار کنید که برخی توابع رو بازنویسی کنند (در ادامه بیشتر متوجه این موضوع میشید).
نحوه ی تعریف یک کلاس abstract
برای تعریف یک کلاس انتزاعی از کلمه کلیدی abstract
قبل از class
استفاده میکنیم :
abstract class Animal
{
public $name;
public $age;
public function Describe()
{
return $this->name . ", " . $this->age . " years old";
}
abstract public function Greet();
}
الان اگه شما از کلاس بالا نمونه بگیرید با اررور مواجه میشید. طبیعی هم هست دیگه 🙂
یادتون باشه درون کلاس abstract
تون میتونید متد هایی رو تعریف کنید و از اونها استفاده کنید و اون متد ها میتونن abstract
باشن یا نه…
اگه متدی رو از نوع abstract
تعریف کردید ، توسعه دهنده های دیگه رو مجبور میکنید : در صورتی که از کلاس شما کلاسی رو به ارث بردن ، حتما نابع رو دوباره بنویسن. مثلا هر کلاسی که از کلاس بالا مشتق بشه ، باید متد Greet
رو دوباره بنویسه.
و یادتون باشه که متد های انتزاعی فقط درون کلاسهای انتزاعی قابل نوشته شدن هستند.
کلاس زیر از کلاس بالا مشتق شده :
class Dog extends Animal
{
public function Greet()
{
return "Woof!";
}
public function Describe()
{
return parent::Describe() . ", and I'm a dog!";
}
}
همونطور که میبینید ما مجبور بودیم که متد Greet()
رو بازنویسی کنیم. حالا میتونیم از کلاس Dog
بصورت زیر نمونه بگیریم :
$animal = new Dog();
$animal->name = "Bob";
$animal->age = 7;
echo $animal->Describe();
echo $animal->Greet();
کاربرد متدهای Abstract در دیزاین پترن template method
دیزاین پترن ها یا الگوهای طراحی نرم افزار الگوهایی مشخص و روتین هستند که بین برنامه نویس ها شناخته شده هستن و یجورایی توسعه دهنده ها میتونن آدرس بدن که فلان کد رو چجوری توسعه دادن بدون اینکه نیاز باشه جزییات رو بگن. یکی از این دیزاین پترن ها template method هست. یه تایم هایی هست که شما کارای تکراری زیادی توی دو تا کلاس دارید و میخواید از اون تکرار جلوگیری کنید. مثلا حالت زیر رو در نظر بگیرید:
<?php
class GatewayPay {
public function changeOrderStatus(){
var_dump('change order status');
}
public function goToGateway(){
var_dump('redirecting to gateway.');
}
}
class WalletPay {
public function changeOrderStatus()
{
var_dump('change order status');
}
public function changeUserCredit(){
var_dump('changing user credit.');
}
}
همونطور که میبینید در این کد متد اول در هر دو کلاس عینا تکرار شده. برای خلاص شدن از شر کد تکراری بالا میشه اینطور کار کرد:
<?php
abstract class Pay
{
public function changeOrderStatus()
{
var_dump('change order status');
}
abstract public function finalize();
}
class GatewayPay implements Pay {
public function finalize(){
var_dump('redirecting to gateway.');
}
}
class WalletPay implements Pay {
public function finalize(){
var_dump('changing user credit.');
}
}
میبینید که متد تکراری رو بردیم بالا توی کلاس دیگه و متدهای دیگه رو هم نام کردیم و کارهای غیر تکراری رو توشون گذاشتیم. اگه حرفامو متوجه شدید بهتون تبریک میگم. شما یک دیزاین پترن به اسم Template Method رو به همین آسونی یاد گرفتید 🙂 جزییات بیشتر رو توی سایت زیر بخونید:
مطلب بسیار خوب و مفیدی هست. درباره کلاس abstract مطلب فارسی تقریبا وجود نداره!
عالی بود. کاملا مفهومی
بسیار مفید ، مخصوصا اینکه با زبان ساده و روان گفته شده
منظور از نمونه گیری چیه ؟
instance 🙂
ینی از اون کلاس یه شئ جدید میسازیم…
Inheritanse
ارث بری
خیلی عالی.من تازه پی اچ پی شروع کردم ولی خیلی گنگم نمیدونم با چ نرم افزاری کار کنم.چطوری شروع کنم.میخوام از ساختن یک سایت شخصی شروع کنم.دوستان راهنمایی کنید مرسی
sublime و phpstorm بهترین ها میتونن باشن…پیشنهاد میکنم روی یکی از توزیع های لینوکس و با یه ایبوک که از پایه همه چیو گفته باشه شروع کنید… پروژه ای کار کردن خوبه ولی بعضی جاها ممکنه به خاطر عدم نیاز تو پروژه، بعضی چیزا نادیده گرفته بشه و بعدن گریبان گیرتون بشه…موفق باشید
ویرایش: این نظر واسه خیلی وقت پیشه و الان vscode رو بیشتر دوس دارم 🙂
Vim یکی از بهترین و محبوب ترین ویرایشگرهای کد هستش
و میتونید از netbeans هم استفاده کنید
سلام دست شما درد نکنه ،خیلی خوب توضیح دادین.
حاجی خیلی دمت گرم 🙂 من تو هیج سایتی حوصله نمیکنم نظر بدم، ولی خیلی گلی!!!
انصافا بدون اینکه از کلمات آکادمیک و اونجورکی استفاده کنی حق مطلبو ادا کردی!!
یعنی اینایی که میزنی دقیقا اون چیزیه که نیازه نه اون چیزایی که کلیه و جز فهرست کتابا!!!
مرسیییی!!!
خیلی چاکریم 😊
باسلام و عرض خسته نباشید
من بیش از یک ساعت است که سایت شما رو میگردم همه مطالب بلااستثنا گویا و بدرد بخور و قابل فهم بودن.
از مدیریت این سایت بسیار بسیار متشکرم
kheyli khubo ravune matalebetun.
interface o kheyliiii khub tozih dade budin kamelan motevajeh shodam
ama class abstract ya yekam pichideas ya man nemitunam betore kamel motevajeh besham?
mishe lotf konid ghesmate akharesho k darid ye sheye jadid misazid ro baraye laravel ham mesal bezanid?
sepas
ممنون خیلی خوب متوجه شدم