‎‎كلاس هاي انتزاعيPHP OOP -‎ ABSTRACT Classes

Previous >    <Next  

‎كلاس يا متد انتزاعي آنهائي هستند، كه متد يا كلاس آن نيازمند تكميل آن توسط اولادش ميباشد. ‎يك كلاس انتزاعي داراي حداقل يك متد وابسته باولاد دارد .يعني آن متد يا متدها در آن كلاس ‎والد معرفي با نام و بدون كد ميباشند.

‎يك كلاس يا متد انتزاعي بوسيله كلمه كليدي‎abstract‎ تعريف ميشود . ‎با كلاس انتزاعي مستقيم نميتوان شئ ايجاد كرد .ايجادشئ از طريق كلاس اولاد امكان پذير است.

‎‎قالب يا فرم كلي آن در اسكريپت زير ميباشد.

<?php 
abstract class ParentClass {
  abstract public function someMethod1();
  abstract public function someMethod2($name, $color);
  abstract public function someMethod3() : string;
}
?> 

‎هنگام ارث بردن از يك كلاس انتزاعي، متد كلاس فرزند بايد باهمان نام،واصلاح كننده دسترسي ‎يكسان ويا كمتر محدود شده، تعريف شود .يعني اگر متد انتزاعي بصورت‎protected‎ ‎،تعريف شود ‎بايد اولاد بهمين صورت يا‎public‎ باشد، امانه ‎private‎ همچنين. ‎نوع وتعداد آرگومان ‎مورد نياز، بايد يكسان باشد .با اين حال كلاس فرزند ميتواند بدنبال آرگومان اختياري داشته ‎باشد.

‎‎بنابراين براي ايجاد كلاس اولاد از كلاس انتزاعي بايد قوانين زير رعايت شود.

‎‎ 1‎ـ متدانتزاعي والد بايد باهمان نام در اولاد ايجادوتكميل شود.

‎‎ 2‎ـ متدكلاس فرزند بايد باهمان اصلاح كننده دسترسي ويا دسترسي بيشتر تعريف شود.

‎ 3‎ـ تعدادآرگومان هاي مورد نياز بايد يكسان باشد، بااين حال كلاس فرزند ميتواند ‎آرگومانهاي اختياري بدنبال آنها داشته باشد.

‎‎مثال ـ به مثال زير توحه نمائيد.

<?php 
// Parent class
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() ;
}

// Child classes
class Audi extends Car {
  public function intro() {
    return "Choose German quality! I'm an $this->name!";
  }
}

class Volvo extends Car {
  public function intro() {
    return "Proud to be Swedish! I'm a $this->name!";
  }
}

class Citroen extends Car {
  public function intro() {
    return "French extravagance! I'm a $this->name!";
  }
}

// Create objects from the child classes
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?> 

--(go to editor for change code and run)

‎‎تشريح مثال ـ

‎در اين مثال با استفاده از كلاس انتزاعيCar سه كلاس با نامهاي Audi,Volvo وCitroen ايجاد شده ‎است .تابع انتزاعيintro()‎ بادسترسيpublic در هرسه تعريف ومطابق نياز تكميل شده است .مابقي ‎موارد ازCar براي آنها بارث رسيده است .

‎‎مثال ـ به مثال زير توجه كنيد كه متد انتزاعي داراي آرگومان است.

<?php 
abstract class ParentClass {
  // Abstract method with an argument
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  public function prefixName($name) {
    if  ($name == "John Doe") {
      $prefix = "Mr.";
    } elseif  ($name == "Jane Doe") {
      $prefix = "Mrs.";
    } else {
      $prefix = "";
    }
    return "{$prefix} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?> 

--(go to editor for change code and run)

‎در اين مثال در كلاس والد تابع انتزاعيprefixName($name) بصورتprotected ميباشد ولي ‎همين تابع در كلاس اولاد بصورتpublic تعريف گرديده يعني دسترسي محدود نشده وافزايش يافته ‎است .پارامترتابع درهر دو با هم يكسان هستند..

‎مثال ـ در اين مثال متد انتراعي والد داراي آرگومان ميباشد،و اولاد داراي دو آرگومان ديگر ‎اختياريست .در تابع انتزاعي‎prefixName()‎‎ در اولاد، دوپارامتر ديگراضافه شده است.

<?php 
abstract class ParentClass {
  // Abstract method with an argument
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  // The child class may define optional arguments that are not in the parent's abstract method
  public function prefixName($name, $separator = ".", $greet = "Dear") {
    if  ($name == "John Doe") {
      $prefix = "Mr";
    } elseif  ($name == "Jane Doe") {
      $prefix = "Mrs";
    } else {
      $prefix = "";
    }
    return "{$greet} {$prefix}{$separator} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?> 

--(go to editor for change code and run)


Previous >    <Next