Lớp trừu tượng
Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 25 trên 91.
Lớp trừu tượng là lớp không thể được khởi tạo trực tiếp. Lớp này làm khuôn mẫu cho các lớp khác, định nghĩa những phương thức mà các lớp con phải triển khai. Bạn tạo lớp trừu tượng bằng từ khóa abstract.
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();
Đầu ra:
15Lớp Shape khai báo một phương thức trừu tượng calculateArea() nhưng không cung cấp phần triển khai. Mọi lớp kế thừa Shape đều phải triển khai phương thức này. Lưu ý rằng lớp trừu tượng cũng có thể chứa các phương thức thông thường như getColor() để các lớp con kế thừa trực tiếp.
Phương thức trừu tượng định nghĩa việc lớp con phải làm, nhưng không quy định cách thực hiện. Nhờ vậy, mọi hình đều có phương thức calculateArea(), đồng thời mỗi hình có thể tính diện tích theo cách khác nhau.
Điểm chính: Lớp trừu tượng kết hợp cấu trúc kế thừa với các yêu cầu bắt buộc. Hãy dùng lớp trừu tượng khi bạn muốn chia sẻ code giữa các lớp có liên quan, đồng thời đảm bảo mỗi lớp con đều triển khai một số phương thức nhất định.
Thử thách
DễHãy xây dựng một hệ thống phát nội dung đa phương tiện để minh họa cách lớp trừu tượng áp đặt một giao ước, đồng thời cho phép các loại nội dung đa phương tiện khác nhau tự triển khai cách phát riêng.
Bạn sẽ sắp xếp code trong ba tệp:
Media.php: Định nghĩa lớp trừu tượngMedia, đóng vai trò làm khuôn mẫu cho mọi loại nội dung đa phương tiện. Lớp này cần có thuộc tính$titlevới phạm vi protected và một hàm khởi tạo nhận rồi thiết lập tiêu đề. Thêm phương thức trừu tượng có tênplay()mà các lớp con phải triển khai. Đồng thời, thêm phương thức thông thườnggetTitle()trả về tiêu đề. Các lớp con sẽ kế thừa phương thức cụ thể này.Song.php: Định nghĩa lớpSongkế thừaMedia. Thêm tệp Media ở đầu tệp. Lớp này bổ sung thuộc tính$artist. Hàm khởi tạo cần nhận tiêu đề và nghệ sĩ: dùngparent::__construct()cho tiêu đề, sau đó tự thiết lập nghệ sĩ. Triển khai phương thức bắt buộcplay()để trả về"Playing song: [title] by [artist]".Podcast.php: Định nghĩa lớpPodcastkế thừaMedia. Thêm tệp Media ở đầu tệp. Lớp này bổ sung thuộc tính$episode(một số nguyên). Hàm khởi tạo cần nhận tiêu đề và số tập: dùngparent::__construct()cho tiêu đề, sau đó thiết lập số tập. Triển khai phương thức bắt buộcplay()để trả về"Playing podcast: [title] - Episode [episode]".
Trong main.php, thêm cả hai tệp Song và Podcast. Bạn sẽ nhận bốn đầu vào: tiêu đề bài hát, tên nghệ sĩ, tiêu đề podcast và số tập (dưới dạng chuỗi cần chuyển thành số nguyên). Tạo một đối tượng Song và một đối tượng Podcast với các giá trị này. In kết quả gọi play() trên bài hát trước, rồi đến podcast, mỗi kết quả trên một dòng riêng.
Thử thách này cho thấy cách lớp trừu tượng định nghĩa một giao ước: mọi loại nội dung đa phương tiện đều phải có phương thức play(), nhưng mỗi loại triển khai phương thức đó theo cách khác nhau. Không thể tạo đối tượng trực tiếp từ lớp trừu tượng Media; lớp này chỉ tồn tại để cung cấp cấu trúc và chức năng dùng chung cho các lớp con.
Tự làm thử
<?php
require_once 'Song.php';
require_once 'Podcast.php';
// Đọc dữ liệu đầu vào
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));
// TODO: Tạo đối tượng Song với songTitle và artistName
// TODO: Tạo đối tượng Podcast với podcastTitle và episodeNumber
// TODO: In ra kết quả khi gọi play() trên bài hát
// TODO: In ra kết quả khi gọi play() trên podcast
?>Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa $thisPhương thứcThuộc tínhHàm khởi tạo (__construct)Hàm hủy (__destruct)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnTừ khóa parent::Ghi đè phương thứcTừ khóa finalLớp trừu tượngÔn tập: hệ thống phân cấp nhân viên7Đóng gói
Công khai, được bảo vệ, riêng tưTìm hiểu sâu về bộ điều chỉnh quyền truy cậpGetter và setterẨn thông tinRút gọn hàm khởi tạo (8.0)Ôn tập: hệ thống hồ sơ học sinh2Không gian tên và tự động nạp
Giới thiệu về không gian tênTừ khóa useChuẩn tự động nạp PSR-4Trình tự động nạp của ComposerÔn tập: dự án có tổ chức5Giao diện và hợp đồng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnGiao diện và lớp trừu tượngGợi ý kiểu với giao diệnÔn tập: Máy tính hình học8Phương thức ma thuật
Giới thiệu về phương thức ma thuật__toString và __debugInfo__get, __set, __isset, __unset__call và __callStatic__clone và sao chép đối tượng__serialize và __unserializeÔn tập: Bộ sưu tập tùy chỉnh3Thuộc tính của lớp
Thuộc tính instance và staticHằng số trong lớpPhương thức và thuộc tính staticThuộc tính private và protectedThuộc tính chỉ đọc (PHP 8.1)Ôn tập: Trình quản lý tài khoản ngân hàng6Đa hình
Xem lại việc ghi đè phương thứcĐa hình qua giao diệnGợi ý kiểu và kiểu hợpLiên kết tĩnh muộnÔn tập: bộ xử lý thanh toánTự luyện tập: Trình biên dịch PHP online