همانطور که گفته شد Abstract Class ها میتوانستند شامل مجموعه ای از متدهای abstract باشند یا نباشند و متدها با بدنه درون آنها قرار داشته باشد. ام اینترفیس ها در برنامه نویسی شی گرا لازم است که همه ی متدهایش Abstract باشد. بعبارتی دیگر هیچ متدی که دارای بادی نباید باشد.
سوالی که در میان است این است که چرا باید Class ای داشته باشیم که دربرگیرنده ی متدهای abstract که هیچ گونه پیاده سازی ندارد،باشد؟ زیرا یک سری ساختار برنامه نویسی هستند که بصورت قرارداد هستند و با استفاده از آنها یک سری force ها و قوانینی وضع کنیم که بقیه باید از آن قوانین پیروی کنند.
خصوصیت Interface ها چیست؟
تمامی متدهایی که در Interface ها قرار دارد همگی abstract هستند ولی عموما از کلمه abstract برای آنها استفاده نمیشود.
ویژگی بعدی Interface ها این است که آنها نمیتوانند property داشته باشند و اگر احیانا داشته باشند از نوع ثابت هستند که در php از کلمه کلیدی Const استفاده میشود و property ها را فقط از نوع ثابت داریم. متدها و اعضای Interface باید publicباشند تا بقیه کلاس ها بتوانند آنها را Implement کنند.
برای تعریف یک کلاس بصورت Interface باید از کلمه کلیدی Interface استفاده کرد.
کلاس countable بصورت Interface تعریف شده است و میگوید هرکسی از این کلاس بخواهد استفاده کند باید آن را ابتدا Implement کند و باید درون خودش متدی به نام count با بادی تعریف کند که در هربار اجرا آن را پیاده سازی کند.
برای استفاده از Abstract Class ها از extend استفاده میشود و مفهوم ارث بری را دارد. اما در Interface ها از مفهوم پیاده سازی با کلمه ی کلیدی Implements استفاده میکنیم و باید تمامی متدهای درون آن را در کلاسی که آنرا implement کرده پیاده سازی شود.
همانطور در شکل زیر میبینید یک کلاس میتواند چندین Interface را Implement کند، که اصطلاحا به آن multiple inheritance گفته میشود.
همانطوری که گفته شد Interface ها شامل متدهایی هستند که بدنه ندارند و ناقص هستند اما قراردادهایی رو الزام میکنند. در این مثال پست باید تمامی متدهای درون لاگر و countable را پیاده سازی کند و از طرفی این کلاس پست میتواند پدر کلاس های دیگر باشد.
در Interface ها متدها همه abstract هستند اما Abstract Class میتواند Abstract داشته باشد یا نه، در Abstract Class ها قابلیت functionality میتوانند داشته باشند و میتوانند متدهای با بادی را به اشتراک بگذارند، اما Interface ها صرفا قرارداد دارد و هیچ بادی ای ندارد. اما هردو قرارداد را تعریف میکند.
مثال را میتوانید به زبان php در سایت گیگ ببینید .