کلاس های انتزاعی (Abstract Classes)
کلاس انتزاعی (Abstract Class) یعنی الگوی کلی. متد انتزاعی (Abstract Method) فقط اعلام می شود، اما پیاده سازی ندارد. سپس کلاس فرزند باید کار را کامل کند. این روش نظم می دهد و قرارداد می سازد.
تعریف کلاس و متد انتزاعی
با کلمه abstract کلاس یا متد را انتزاعی کن. متد انتزاعی بدن ندارد و فقط امضا دارد.
<?php
abstract class ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract public function someMethod3() : string;
}
?>
نکته: امضا یعنی نام، سطح دسترسی، نوع خروجی، و ورودی ها.
قوانین وراثت در کلاس انتزاعی
کلاس فرزند باید همان نام متد را پیاده کند. همچنین سطح دسترسی باید مساوی یا بازتر باشد. شمار آرگومان های ضروری باید یکی باشد. آرگومان اختیاری می تواند بیشتر باشد.
مثال: پیاده سازی متد انتزاعی
در این مثال، هر برند متن خودش را برمی گرداند. نوع خروجی string است.
<?php
// Parent class
abstract class Car {
public $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
// Child classes
class Audi extends Car {
public function intro() : string {
return "Choose German quality! I'm an $this->name!";
}
}
class Volvo extends Car {
public function intro() : string {
return "Proud to be Swedish! I'm a $this->name!";
}
}
class Citroen extends Car {
public function intro() : string {
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();
?>
مثال: آرگومان اجباری
اینجا متد انتزاعی ورودی می گیرد. کلاس فرزند آن را کامل می کند.
<?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");
?>
مثال: آرگومان های اختیاری بیشتر
کلاس فرزند می تواند آرگومان اختیاری اضافه کند. اما ضروری ها باید یکی باشد.
<?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");
?>
هشدار: از کلاس انتزاعی نمی توان شیء مستقیم ساخت. حتماً از کلاس فرزند استفاده کن.
گام های عملی
- یک کلاس انتزاعی با یک متد بساز.
- یک کلاس فرزند ایجاد کن و متد را کامل کن.
- شیء از فرزند بساز و خروجی بگیر.
برای ادامه مسیر، صفحه ثابت ها و رابط ها را ببین. همچنین وراثت پایه درک کلاس انتزاعی است.
جمع بندی سریع
- کلاس انتزاعی قرارداد می سازد.
- متد انتزاعی بدن ندارد.
- فرزند باید همان امضا را پیاده کند.
- سطح دسترسی نباید محدودتر شود.