Abstract Class (lớp trừu tượng) trong PHP
- 17-03-2023
- Toanngo92
- 0 Comments
Mục lục
Khái niệm Abstract Class (lớp trừu tượng)
Trong khi thực hiện kế thừa, có thể thấy rằng người ta có thể tạo đối tượng của lớp cha cũng như lớp con. Tuy nhiên, nếu người dùng muốn hạn chế sử dụng trực tiếp lớp cha thì sao? Nghĩa là, trong một số trường hợp, người ta có thể muốn định nghĩa một lớp cơ sở khai báo cấu trúc của một thực thể nhất định mà không đưa ra cách triển khai đầy đủ mọi phương thức. Một lớp cơ sở như vậy đóng vai trò là một dạng tổng quát sẽ được kế thừa bởi tất cả các lớp con của nó. Các phương thức của lớp cơ sở phục vụ như một hợp đồng hoặc một tiêu chuẩn mà lớp con có thể triển khai theo cách riêng của nó.
Một lớp trừu tượng phục vụ như một khuôn khổ cung cấp một số hành vi nhất định cho các lớp khác. Lớp con cung cấp hành vi theo yêu cầu cụ thể của khung hiện có. Các lớp trừu tượng không thể được khởi tạo và chúng phải được phân lớp để sử dụng các thành viên của lớp. Lớp con cung cấp các triển khai cho các phương thức trừu tượng trong lớp cha của nó.
PHP cung cấp từ khóa abstract để sử dụng tác vụ này.
Sau đây là một số điểm quan trọng cần lưu ý về các abstract class và abstract method:
- Các abstract class có thể có các method (phương thức) và properties (thuộc tính) tương tự như các class khác. Tuy nhiên, chúng không thể được khởi tạo.
- Một class con phải được tạo để khởi tạo một abstract class.
- Class (lớp) phải là abstract (trừu tượng) để có một method (phương thức) trừu tượng.
- (Abstract method) Phương thức trừu tượng là một khai báo có phần thân rỗng. Tên của phương thức và đối số được cung cấp bởi người dùng.
Ví dụ:
<?php
abstract class Microwave{
abstract public function bake();
}
Trong ví dụ này, lớp Microwave là abstract class với bake() là một abstract method.
Mục đích chính của abstract class là để cho các nhà phát triển tuân theo các nguyên tắc nhất định. Ví dụ: để tạo một lớp mới kế thừa lớp Microwave , cần cung cấp định nghĩa cho abstract method bake().
Do đó, lớp con bắt buộc phải định nghĩa phương thức bake().
Non-Abstract Method trong Abstract Class (Phương thức không trừu tượng trong Abstract Class)
Một phương thức trừu tượng có thể có cả phương thức trừu tượng và không trừu tượng. Một lớp có phương thức trừu tượng phải được khai báo trừu tượng, lớp con có thể truy cập mà không cần ghi đè.
Ví dụ sau đây cho thấy cách bao gồm phương thức không trừu tượng trong Microwave được xác định trước đó:
<?php
abstract class Microwave{
protected $degree;
public function start(){
echo $this->degree."- Microwave start ... <br/>";
}
public function stop(){
echo $this->degree. "- Microwave stop ... <br/>";
}
public function setDegree($degree){
$this->degree = $degree;
}
abstract public function bake();
}
Trong ví dụ này, ba phương thức không trừu tượng là start(), stop() và setDegree() được thêm vào abstract class Microwave:
Kế thừa abstract class (inheriting abstract class/extend abstract class)
Tương tự như các lớp khác, các lớp trừu tượng cũng có thể được kế thừa. Lớp con khộng nếu định nghĩa là abstract class, nó phải định nghĩa abstract method . Ngược lại, lớp con nếu được định nghĩa là abstract class nó không định nghĩa abstract method.
Ví dụ:
abstract class Microwave{
protected $degree;
public function start(){
echo $this->degree."- Microwave start ... <br/>";
}
public function stop(){
echo $this->degree. "- Microwave stop ... <br/>";
}
public function setDegree($degree){
$this->degree = $degree;
}
abstract public function bake();
}
abstract class Oven extends Microwave{
abstract function bake();
}
class Onida extends Microwave{
public function bake(){
echo $this->degree."- Onida bake ... <br/>";
}
}
class Samsung extends Microwave{
public function bake(){
echo $this->degree."- Samsung bake ... <br/>";
}
}
$samsung = new Samsung();
$samsung->setDegree("1000");
$samsung->bake();
Khác biệt giữa một interface và một abstract class
- Trong khi một interface không thể có các method cụ thể và chỉ có các method trừu tượng, một abstract class có thể có cả hai.
- Trong một interface, người dùng chỉ có thể khai báo các method là public. Tuy nhiên, trong một abstract class, người dùng có thể khai báo các phương thức là public, private hoặc protected.
- Trong một class có thể triển khai nhiều interface nhưng chỉ có một lớp abstract class có thể được kế thừa.