🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ علی
interface ها
امیر صالحی حل شده توسط امیر صالحی

سلام

 

چه زمانی از interface‌ها و چه زمانی از abstract class‌ها استفاده میشه؟ درواقع چه زمانی یکی را بر دیگری ترجیح می‌دهیم.

سلام و احترام

interface‌ها زمانی استفاده میشه که شما فقط بخوای یک قرار دادی تعریف کنید که هر کسی که این interface رو implement کردن مجبور بشه که متدهای داخل رو پیاده سازی کنه

<?php
interface InterfaceName 
{
  public function someMethod1();
  public function someMethod2($name, $color);
  public function someMethod3() : string;
}

اما توی abstract کلاس‌ها شما هم میتونید یک سری قوانین تعریف کنید که هر کسی این abstract کلاس رو extend کرد پیاده سازی کنه و هم همزمان میتونید متدهایی داخلش داشته باشید که پیاده سازی شدند و توی تمامی کلاس هایی که این abstract کلاس رو extend میکنند مشترک و قابل استفاده است.

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);
    // Common method
    public function printOut() {
        print $this->getValue() . "\n";
    }
}
class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }
    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }
    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";

همون طور که در کد بالا مشخصه توی abstract کلاس ما دوتا متد abstract تعریف کردیم که هر کلاسی که اون رو extend کرد باید پیاده سازیش کنه و هم یه متد که بین همشون مشترکه به اسم printOut هم تعریف کردیم که بین تمامی کلاس هایی که abstract مارو extend کردن مشترکه و کار مشخصی رو انجام میده

خروجی ها

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
بهترین پاسخ
امیر صالحی ۱۴ فروردین ۱۴۰۰، ۱۶:۰۴