PHP - Các lớp và phương pháp trừu tượng là gì?
Các lớp và phương pháp trừu tượng là khi lớp cha có một phương thức được đặt tên, nhưng cần [các] lớp con của nó để điền vào các nhiệm vụ.
Một lớp trừu tượng là một lớp chứa ít nhất một phương pháp trừu tượng. Một phương pháp trừu tượng là một phương thức được khai báo, nhưng không được thực hiện trong mã.
Một lớp hoặc phương thức trừu tượng được xác định với từ khóa abstract
:
Cú pháp
Khi kế thừa từ một lớp trừu tượng, phương thức lớp con phải được xác định cùng tên và cùng một công cụ sửa đổi truy cập bị hạn chế. Vì vậy, nếu phương thức trừu tượng được định nghĩa là được bảo vệ, phương pháp lớp con phải được định nghĩa là được bảo vệ hoặc công khai, nhưng không riêng tư. Ngoài ra, loại và số lượng các đối số cần thiết phải giống nhau. Tuy nhiên, các lớp trẻ có thể có các đối số tùy chọn ngoài ra.
Vì vậy, khi một lớp trẻ được kế thừa từ một lớp trừu tượng, chúng ta có các quy tắc sau:
- Phương pháp lớp con phải được xác định cùng tên và nó được phân chia lại phương thức trừu tượng của cha mẹ
- Phương pháp lớp con phải được xác định với cùng hoặc một công cụ sửa đổi truy cập ít bị hạn chế
- Số lượng các đối số cần thiết phải giống nhau. Tuy nhiên, lớp trẻ có thể có các đối số tùy chọn ngoài ra
Hãy xem xét một ví dụ:
Thí dụ
Tên = $ name; & nbsp; } & nbsp; Tóm tắt chức năng công cộng giới thiệu []: Chuỗi; }
// Parent class
abstract class Car {
public $name;
public function __construct[$name] {
$this->name = $name;
}
abstract public function intro[] : string;
}
// lớp trẻ Audi mở rộng xe {& nbsp; hàm công khai intro []: chuỗi {& nbsp; & nbsp; & nbsp; Trả lại "Chọn chất lượng Đức! Tôi là một tên $ this->!"; & nbsp; }}
class Audi extends Car {
public function intro[] : string {
return "Choose German quality! I'm an $this->name!";
}
}
lớp Volvo mở rộng xe {& nbsp; hàm công khai intro []: chuỗi {& nbsp; & nbsp; & nbsp; Trả lại "Tự hào là người Thụy Điển! Tôi là một tên $ this->!"; & nbsp; }}
public function intro[] : string {
return "Proud to be Swedish! I'm a $this->name!";
}
}
lớp citroen mở rộng xe {& nbsp; hàm công khai intro []: chuỗi {& nbsp; & nbsp; & nbsp; Trả lại "Sự ngông cuồng của Pháp! Tôi là một tên $ this->!"; & nbsp; }}
public function intro[] : string {
return "French extravagance! I'm a $this->name!";
}
}
// tạo các đối tượng từ các lớp con $ audi = new Audi ["audi"]; echo $ audi-> intro []; echo "";
$audi = new audi["Audi"];
echo
$audi->intro[];
echo "
";
$ volvo = new Volvo ["Volvo"]; echo $ volvo-> intro []; echo "";
echo $volvo->intro[];
echo "
";
$ citroen = new Citroen ["citroen"]; echo $ citroen-> intro [];?>
echo $citroen->intro[];
?>
Hãy tự mình thử »
Ví dụ giải thích
Các lớp Audi, Volvo và Citroen được kế thừa từ lớp xe hơi. Điều này có nghĩa là các lớp Audi, Volvo và Citroen có thể sử dụng thuộc tính tên $ công khai cũng như phương thức __construct [] công khai từ lớp xe vì kế thừa.
Nhưng, intro [] là một phương thức trừu tượng nên được xác định trong tất cả các lớp con và chúng nên trả về một chuỗi.
PHP - Ví dụ về lớp trừu tượng hơn
Hãy xem xét một ví dụ khác trong đó phương pháp trừu tượng có một đối số:
Thí dụ
Tên = $ name; & nbsp; } & nbsp; Tóm tắt chức năng công cộng giới thiệu []: Chuỗi; }
abstract class ParentClass {
// Abstract method with an argument
abstract protected function prefixName[$name];
}
// lớp trẻ Audi mở rộng xe {& nbsp; hàm công khai intro []: chuỗi {& nbsp; & nbsp; & nbsp; Trả lại "Chọn chất lượng Đức! Tôi là một tên $ this->!"; & nbsp; }}
public function prefixName[$name] {
if [$name == "John Doe"] {
$prefix = "Mr.";
} elseif [$name == "Jane Doe"] {
$prefix = "Mrs.";
} else {
$prefix = "";
}
return "{$prefix} {$name}";
}
}
lớp Volvo mở rộng xe {& nbsp; hàm công khai intro []: chuỗi {& nbsp; & nbsp; & nbsp; Trả lại "Tự hào là người Thụy Điển! Tôi là một tên $ this->!"; & nbsp; }}
echo $class->prefixName["John Doe"];
echo "
";
echo $class->prefixName["Jane Doe"];
?>
Hãy tự mình thử »
Ví dụ giải thích
Thí dụ
Tên = $ name; & nbsp; } & nbsp; Tóm tắt chức năng công cộng giới thiệu []: Chuỗi; }
abstract class ParentClass {
// Abstract method with an argument
abstract protected function prefixName[$name];
}
// lớp trẻ Audi mở rộng xe {& nbsp; hàm công khai intro []: chuỗi {& nbsp; & nbsp; & nbsp; Trả lại "Chọn chất lượng Đức! Tôi là một tên $ this->!"; & nbsp; }}
// 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}";
}
}
lớp Volvo mở rộng xe {& nbsp; hàm công khai intro []: chuỗi {& nbsp; & nbsp; & nbsp; Trả lại "Tự hào là người Thụy Điển! Tôi là một tên $ this->!"; & nbsp; }}
echo $class->prefixName["John Doe"];
echo "
";
echo $class->prefixName["Jane Doe"];
?>
Hãy tự mình thử »