PHP – کلاس های انتزاعی (Abstract Classes)
آخرین بروزرسانی:
PHP - کلاسها و متدهای انتزاعی چیستند؟
کلاسها و متدهای انتزاعی زمانی کاربرد دارند که کلاس والد یک متد با نام مشخص داشته باشد، اما نیاز باشد که کلاسهای فرزند آن وظایف آن را تکمیل کنند.
یک کلاس انتزاعی کلاسی است که حداقل یک متد انتزاعی داشته باشد. یک متد انتزاعی، متدی است که اعلام شده اما در کد پیادهسازی نشده است.
یک کلاس یا متد انتزاعی با استفاده از کلمه کلیدی abstract
تعریف میشود:
نحو
<?php
abstract class ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract public function someMethod3() : string;
}
?>
قوانین ارثبری از یک کلاس انتزاعی
- متد کلاس فرزند باید با همان نام اعلام شود و متد انتزاعی والد را دوباره تعریف کند.
- متد کلاس فرزند باید با همان سطح دسترسی یا سطح دسترسی کمتر تعریف شود.
- تعداد آرگومانهای لازم باید یکسان باشد. با این حال، کلاس فرزند میتواند آرگومانهای اختیاری اضافی داشته باشد.
مثال
<?php
// کلاس والد
abstract class Car {
public $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
// کلاسهای فرزند
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!";
}
}
// ایجاد اشیاء از کلاسهای فرزند
$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();
?>
توضیحات مثال
کلاسهای Audi
، Volvo
و Citroen
از کلاس Car
به ارث بردهاند. این بدین معنی است که کلاسهای Audi
، Volvo
و Citroen
میتوانند از ویژگی عمومی $name
و متد عمومی __construct()
کلاس Car
استفاده کنند به دلیل ارثبری.
اما، intro()
یک متد انتزاعی است که باید در تمامی کلاسهای فرزند تعریف شود و باید یک رشته را برگرداند.
مثالهای بیشتر از کلاس انتزاعی
مثال با آرگومان
<?php
abstract class ParentClass {
// متد انتزاعی با یک آرگومان
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 protected function prefixName($name);
}
class ChildClass extends ParentClass {
// کلاس فرزند ممکن است آرگومانهای اختیاری تعریف کند که در متد انتزاعی والد نیستند
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");
?>
نکات کلیدی
- اطمینان از پیادهسازی متدهای خاص در آنها استفاده میشوند.
- متدهای انتزاعی فقط اعلام میشوند و پیادهسازی نمیشوند؛ کلاسهای فرزند باید آنها را پیادهسازی کنند.
- کلاسهای انتزاعی میتوانند دارای متدهای معمولی (غیر انتزاعی) باشند که در کلاسهای فرزند نیز به ارث برده میشوند.
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام