OOP - کلاسهای Abstract
PHP - کلاس ها و متدهای abstract چیستند؟
کلاسها و متدهای abstract زمانی هستند که کلاس پدر یک متد نامگذاری شده دارد، اما کلاس(های) فرزند آن میبایست آن را پیاده سازی کنند. [۱]
یک کلاس abstract کلاسی است که حداقل شامل یک متد abstract باشد. یک متد abstract متدی است که تعریف شدهاست، اما پیاده سازی نشدهاست.
یک کلاس یا متد abstract با کلمه کلیدی abstract
تعریف میشود:
شیوه نوشتار
1 <?php
2 abstract class ParentClass {
3 abstract public function someMethod1();
4 abstract public function someMethod2($name, $color);
5 abstract public function someMethod3() : string;
6 }
7 ?>
زمانی ارث بری کردن از یک کلاس abstract، متدهای کلاس فرزند میبایست با نام یکسان، یا مشخص کننده دسترسی یکسان یا مشخص کننده دسترسی ای که محدودیت کمتری دارد تعریف شوند؛ بنابراین، اگر متد abstract به صورت یک متد protected تعریف شود، کلاس فرزند میبایست به صورت protected یا public، نه به صورت private تعریف شود. همچنین نوع و تعداد آرگومانهای مورد نیاز نیز میبایست یکسان باشد. اما، کلاسهای فرزند میتوانند آرگومانهای اختیاری جدیدی نیز داشته باشند.
بنابراین، زمانی که یک کلاس فرزند از یک کلاس abstract ارث بری میکند، ما قوانین زیر را داریم:
- متدهای کلاس فرزند میبایست با نام یکسان تعریف شود و متد abstract کلاس والد را پیادهسازی کنند
- متدهای کلاس فرزند میبایست با مشخص کننده دسترسی یکسان یا مشخص کننده دسترسیای که محدودیت کمتری دارد تعریف شوند
- تعداد آرگومانهای مورد نیاز میبایست برابر باشد. اما، کلاس فرزند میتوانند به علاوه آرگومانهای مورد نیاز آرگومانهای اختیاری نیز داشته باشد
بگذارید به یک مثال نگاهی بیندازیم:
مثال
1 <?php
2 // Parent class
3 abstract class Car {
4 public $name;
5 public function __construct($name) {
6 $this->name = $name;
7 }
8 abstract public function intro() : string;
9 }
10
11 // Child classes
12 class Audi extends Car {
13 public function intro() : string {
14 return "Choose German quality! I'm an $this->name!";
15 }
16 }
17
18 class Volvo extends Car {
19 public function intro() : string {
20 return "Proud to be Swedish! I'm a $this->name!";
21 }
22 }
23
24 class Citroen extends Car {
25 public function intro() : string {
26 return "French extravagance! I'm a $this->name!";
27 }
28 }
29
30 // Create objects from the child classes
31 $audi = new audi("Audi");
32 echo $audi->intro();
33 echo "<br>";
34
35 $volvo = new volvo("Volvo");
36 echo $volvo->intro();
37 echo "<br>";
38
39 $citroen = new citroen("Citroen");
40 echo $citroen->intro();
41 ?>
توضیح مثال
کلاسهای Audi ،Volvo و Citroen از کلاس Car ارث بری کردهاند. این بدان معناست که کلاسهای Audi ،Volvo و Citroen میتوانند از ویژگی public $name و متد public __construct() از کلاس Car به خاطر ارث بری استفاده کنند.
اما، متد intro() یک متد abstract است که میبایست درون تمامی کلاسهای فرزند تعریف شود و میبایست یک مقدار متنی (به انگلیسی: string) برگرداند.
PHP - مثال های بیشتری از کلاس Abstract
بگذارید به مثال دیگری که متد abstract یک آرگومان دارد نگاهی بیندازیم:
مثال
1 <?php
2 abstract class ParentClass {
3 // Abstract method with an argument
4 abstract protected function prefixName($name);
5 }
6
7 class ChildClass extends ParentClass {
8 public function prefixName($name) {
9 if ($name == "John Doe") {
10 $prefix = "Mr.";
11 } elseif ($name == "Jane Doe") {
12 $prefix = "Mrs.";
13 } else {
14 $prefix = "";
15 }
16 return "{$prefix} {$name}";
17 }
18 }
19
20 $class = new ChildClass;
21 echo $class->prefixName("John Doe");
22 echo "<br>";
23 echo $class->prefixName("Jane Doe");
24 ?>
بگذارید به مثال دیگری که متد abstract یک آرگومان دارد، و کلاس فرذزند نیز دو آرگومان اختیاری دارد که درون متد abstract کلاس پدر تعریف نشدهاست:
مثال
1 <?php
2 abstract class ParentClass {
3 // Abstract method with an argument
4 abstract protected function prefixName($name);
5 }
6
7 class ChildClass extends ParentClass {
8 // The child class may define optional arguments that are not in the parent's abstract method
9 public function prefixName($name, $separator = ".", $greet = "Dear") {
10 if ($name == "John Doe") {
11 $prefix = "Mr";
12 } elseif ($name == "Jane Doe") {
13 $prefix = "Mrs";
14 } else {
15 $prefix = "";
16 }
17 return "{$greet} {$prefix}{$separator} {$name}";
18 }
19 }
20
21 $class = new ChildClass;
22 echo $class->prefixName("John Doe");
23 echo "<br>";
24 echo $class->prefixName("Jane Doe");
25 ?>
منابع آموزشی