آموزش الگوی پیاده سازی توابع interface در PHP


آموزش الگوی پیاده سازی توابع / interface در PHP شی گرا – مرحله ی بعدی مفهوم انتزاع (abstraction)

Interface در تکنیک برنامه نویسی شی گرا یک الگوی پیاده سازی برای توابع بوده و از جهاتی شبیه کلاس های انتزاعی (abstract class) محسوب می شود. بدین معنی که interface نیز مانند کلاس های انتزاعی میزبان تعدادی متد abstract است که توسعه دهنده باید آن ها را در بدنه ی کلاس ارث برنده از interface، پیاده سازی کند. از آنجایی که interface ها کلاس های ارث برنده را مجاب به پیاده سازی متد مورد نظر می کنند، به سازمان دهی و خوانایی هرچه بیشتر کد اپلیکیشن کمک شایانی می نمایند.

استفاده از interface زمانی کارایی واقعی خود را نشان می دهد که یک تیم بر روی پروژه کار می کنند و مدیر پروژه می خواهد مطمئن شود که برنامه نویسان تیم، متدهای اعلان شده در interface را پیاده سازی می کنند. همچنین زمانی که یک برنامه نویس بخواهد خود را مجاب به پیاده سازی چندین متد معین در کلاس های فرزند بکند، استفاده از interface می تواند بسیار کارامد باشد.

به عبارت دیگر، interface کلاس هایی که ازش ارث بری دارند را مجبور به پیاده سازی متدهای abstract موجود در خود می کند.

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

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

چگونگی اعلان و پیاده سازی یک interface

جهت اعلان یک interface از کلیدواژه ی interface استفاده می کنیم. برای اینکه یک کلاس بتواند از interface ارث بری کند، لازم است از کلیدواژه ی implement استفاده شود. دستور استفاده از آن را در زیر مشاهده می کنید:

interface interfaceName {     // abstract methods  }  class Child implements interfaceName {    // defines the interface methods and may have its own code  }  

در مثال ساده ی زیر، یک interface ساده برای کلاس هایی که کد مربوط به car را مدیریت می کنند، اعلان می کنیم. این interface تمامی کلاس های فرزند و مشتق شده از خود را مجبور به پیاده سازی متدهای انتزاعی setModel() و getModel() می نماید.

interface Car {     public function setModel($name);    public function getModel();  }  

interface ها نیز می توانند همچون کلاس های abstract، متدهای انتزاعی و ثوابت (constant) داشته باشند. با این حال، برخلاف کلاس های abstract، تنها توابع با سطح دسترسی public را شامل شده و نمی توانند متغیر داشته باشند.

کلاس هایی که interface های مورد نظر را پیاده سازی می کنند، مجابند تمامی متدهایی که از interface نام برده به ارث می برند را به همراه پارامترهای آن ها، پیاده سازی کنند. بنابراین، در کلاس غیرانتزاعی miniCar، کد لازم را در بدنه ی تمامی متدهای abstract و انتزاعی پیاده سازی می کنیم.

class miniCar implements Car {    private $model;     public function setModel($name)    {       $this -> model = $name;     }    public function getModel()    {      return $this -> model;     }  }  

پیاده سازی چندین interface در کلاسی واحد

می توان چندین interface را در یک کلاس پیاده سازی کرد. بدین وسیله توسعه دهنده می تواند اصل عدم امکان ارث بری بیش از یک کلاس پدر را دور بزند. جهت نمایش قابلیت پیاده سازی چندین interface در آن واحد در یک کلاس، یک interface دیگر به نام Vehicle تعریف می کنیم. این interface کلاس هایی که آن را پیاده سازی می کنند، مجبور به استفاده از یک property از نوع بولی به نام $hasWheels در بدنه ی خود می کند.

interface Vehicle {    public function setHasWheels($bool);     public function getHasWheels();  }  

اکنون کلاس فرزند ما می تواند همزمان دو interface را پیاده سازی کند.

class miniCar implements Car, Vehicle {    private $model;     private $hasWheels;     public function setModel($name)    {       $this -> model = $name;     }    public function getModel()    {      return $this -> model;     }    public function setHasWheels($bool)    {       $this -> hasWheels = $bool;     }    public function getHasWheels()    {    return ($this -> hasWheels)? "has wheels" : "no wheels";    }  }  

شرح تفاوت بین کلاس های انتراعی و interface ها

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

  • interface می تواند در بدنه ی خود توابع انتزاعی و ثوابت داشته باشد، اما امکان اعلان متدهای concrete (با پیاده سازی یا بدنه) و متغیر در آن وجود ندارد.
  • تمامی متدهای موجود در interface باید با سطح دسترسی public تعریف شده باشند.
  • یک کلاس می تواند همزمان چندین interface را پیاده سازی کند، این در حالی است که امکان ارث بری تنها از یک کلاس abstract برای کلاس فرزند وجود دارد.

در زیر این تفاوت ها را به طور خلاصه در قالب یک جدول شرح می دهیم:

interfaceabstract class
(کلاس انتزاعی)

کد- abstract methods
– constants- abstract methods
(متدهای انتزاعی)
– constants
– concrete methods
(متدهایی با بدنه و پیاده سازی)
– concrete variables
(متغیرهای واقعی)

access modifiers
(سطوح دسترسی)- public- public
– protected- private
etc.

تعداد کلاس های پدریک کلاس می تواند همزمان چندین interface را پیاده سازی کند.کلاس فرزند تنها می تواند از یک کلاس انتزاعی (پدر) ارث بری داشته باشد.

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

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