کلاس Abstract در PHP شی گرا


آموزش کلاس ها و متدهای انتزاعی (Abstract) در PHP شی گرا

از کلاس های abstract زمانی استفاده می کنیم که بخواهیم برنامه نویس را مجاب به پیاده سازی متد خاصی در کلاس مشتق بکنیم. در استفاده از کلاس های انتزاعی، می خواهیم توسعه دهنده متدی با نام معین را پیاده سازی کند ولی درباره ی منطق و کد داخل بدنه ی آن اطمینانی نداشته و در واقع آن را به خود توسعه دهنده واگذار می کنیم. لازم به ذکر است که در کلاس abstract تنها تعریف متد وجود داشته و پیاده سازی آن در کلاس مشتق شده از کلاس انتزاعی، انجام می شود. به عنوان مثال می توان به اشکال مختلف نظیر دایره، مستطیل، هشت گوش و غیره که هر یک یک کلاس است اشاره کرد. اگرچه تمامی این اشکال دارای ظاهری متفاوت هستند، با این وجود همه 2 بعدی بوده و دارای ویژگی های مشترکی نظیر مساحت و محیط می باشند. بنابراین، توصیه می شود کدهایی را که بین چند کلاس مزبور مشترک هست را داخل یک کلاس پدر (ارشد) گنجانده و سپس در صورت نیاز از آن ارث بری کرد.

در این کلاس پدر، دو ویژگی (property) مساحت (area) و محیط (circumference) را قرار می دهیم. همچنین ممکن است یک متد داخل کلاس تعریف کنیم که مساحت را محاسبه می کند (که به دلیل تفاوت در شکل هر کلاس و محاسبات مختلفی که لازم است پیچیدگی های خاص خود را دارد).

در شرایطی از این دست که لازم است کلاس مشتق را مجاب به پیاده سازی تعدادی متد با اسم معین (که از کلاس پدر به ارث برده) کرده ولی نمی توانیم این امر را درباره ی بدنه و جزئیات پیاده سازی متد مورد نظر اعمال کنیم، از کلاس های انتزاعی یا abstract برای نیل به هدف کمک می گیریم.

کلاس انتزاعی، کلاسی است که حداقل یک متد abstract داشته باشد.متدهای abstract فقط اسم و آرگومان دارند و جزئیات بدنه ی آن ها و در واقع عملیاتی که انجام می دهند مشخص نیست. به همین علت نمی توان از روی کلاس های abstract آبجکت ساخت. بجای این کار، کلاس های فرزندی از کلاس انتزاعی مشتق کرده و داخل کلاس فرزند کد مورد نیاز را در بدنه ی متد پیاده سازی، سپس از روی این کلاس های مشتق آبجکت می سازیم.

آنچه خواهید آموخت:

  1. نحوه ی اعلان کلاس و متدهای abstract را خواهید آموخت.
  2. می آموزید چگونه داخل کلاس abstract متدهای غیرانتزاعی تعریف نمایید.
  3. خواهید توانست از کلاس انتزاعی، کلاس فرزند ایجاد نمایید.

آموزش اعلان کلاس ها و متدهای انتزاعی

به منظور اعلان یک کلاس انتزاعی، لازم است قبل از اسم کلاس مورد نظر کلیدواژه ی abstract را درج نمایید. مثال:

abstract class Car { }

متدهایی که داخل بدنه ی کلاس انتراعی تعریف می شوند نیز با کلیدواژه ی abstract تعریف می شوند. همان طور که قبلا ذکر شد، کلاس های انتزاعی بدنه ندارند و تنها اسم و پارامترهای ورودی آن ها تعیین شده است.

در مثال زیر، یک متد انتزاعی با سطح دسترسی public به نام calcNumMilesOnFullTank() ایجاد می کنیم. این اسم نقش اسکلت متدی را ایفا می کند که برنامه نویس باید در کلاس های فرزند آن را پیاده سازی نماید. این متدها تعداد مایل هایی که اتومبیل با یک باک پر می تواند طی کند را محاسبه کرده و برمی گرداند.

// Abstract classes are declared with the abstract keyword, and contain abstract methods.  abstract class Car {    abstract public function calcNumMilesOnFullTank();  }  

توجه داشته باشید که اگر متدی abstract تعریف شده باشد، آنگاه کلاس میزبان هم باید انتزاعی باشد.

تعریف متدهای غیرانتزاعی داخل کلاس های abstract

یک کلاس انتزاعی می تواند داخل خود متدهایی داشته باشد که با کلیدواژه ی abstract تعریف نشده اند. در واقع، کلاس انتزاعی می تواند property هایی نیز داشته باشد و property نمی تواند abstract باشد.

در زیر property ای به نام $tankVolume با سطح دسترسی protected و یک متد public به نام setTankvolume() را در کلاس فوق تعریف می کنیم.

                          abstract class Car {    // Abstract classes can have properties    protected $tankVolume;    // Abstract classes can have non abstract methods    public function setTankVolume($volume)    {      $this -> tankVolume = $volume;    }    // Abstract method    abstract public function calcNumMilesOnFullTank();  }  

آموزش (ارث بری) ایجاد کلاس مشتق از روی کلاس abstract

از آنجایی که نمی توان از روی کلاس های انتزاعی آبجکت ساخت، ناگذیر برای استفاده از کد داخل آن باید از این کلاس ارث بری کرد. جهت ایجاد کلاس مشتق از کلاس انتزاعی باید مانند سایر کلاس های فرزندی که از یک کلاس پدر گرفته می شوند، از کلیدواژه ی extend استفاده نمود. اما همان طور که توضیح دادیم، توسعه دهنده بایستی بدنه ی متد ارث بری شده از کلاس انتزاعی را خود داخل کلاس فرزند پیاده سازی کند.

در زیر یک کلاس فرزند به نام Honda ایجاد کرده و داخل آن متد abstract ای که آن را از کلاس پدر به ارث برده، calcNumMilesOnFullTank()، پیاده سازی می کنیم.

class Honda extends Car {    // Since we inherited abstract method, we need to define it in the child class,     // by adding code to the method's body.    public function calcNumMilesOnFullTank()    {      $miles = $this -> tankVolume*30;      return $miles;    }  }  

می توانیم یک کلاس فرزند دیگر از کلاس انتزاعی Car مشتق کرده و آن را Toyota نام گذاری کنیم و سپس مجددا متد انتزاعیcalcNumMilesOnFullTank() را با کمی تغییر در بدنه ی آن (محاسبه ای که انجام می دهد)، داخل این کلاس مشتق پیاده سازی نماییم. علاوه بر آن، داخل کلاس فرزند متد اختصاصی خود به نام getColor() را که رشته ی “beige” را در خروجی برمی گرداند، اضافه کنیم.

class Toyota extends Car {    // Since we inherited abstract method, we need to define it in the child class,     // by adding code to the method's body.    public function calcNumMilesOnFullTank()    {      return $miles = $this -> tankVolume*33;    }    public function getColor()    {      return "beige";    }  }  

یک آبجکت جدید به نام $toyota1 ساخته و مقدار 10 را به عنوان پارامتر به متد setTankVolume(10); ارسال می کنیم. این آبجکت میزان مسافتی که اتومبیل قادر است با 10 گالون سوخت طی کند و نیز رنگ آن اتومبیل را در خروجی به وسیله ی دو تابع ارث بری شده بازگردانی می کند.

$toyota1 = new Toyota();  $toyota1 -> setTankVolume(10);  echo $toyota1 -> calcNumMilesOnFullTank();//330  echo $toyota1 -> getColor();//beige  

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *