Các Abstract Classes là các lớp trong Dart có một hoặc nhiều phương thức trừu tượng. Tính trừu tượng là một phần của gói dữ liệu nơi hoạt động thực sự bên trong của hàm ẩn với người dùng. Chúng chỉ tương tác với chức năng bên ngoài. Chúng ta có thể khai báo Abstract Classes bằng cách sử dụng từ khóa trừu tượng. Có khả năng một Abstract Classes có thể có hoặc không có các phương thức trừu tượng.
Các phương thức trừu tượng là những phương thức được khai báo mà không cần thực thi. Các phương pháp cụ thể hoặc phương pháp bình thường được khai báo cùng với việc thực hiện. Một Abstract Classes có thể chứa cả hai loại phương thức, nhưng một lớp bình thường không được phép có các phương thức trừu tượng.
Các bài viết liên quan:
Chúng ta không thể tạo thể hiện của một Abstract Classes có nghĩa là nó không thể được khởi tạo. Nó chỉ có thể được mở rộng bởi lớp con và lớp con phải được cung cấp khả năng cấy ghép các phương thức trừu tượng có trong lớp hiện tại. Khi đó cần phải khai báo lớp con trừu tượng.
Định nghĩa Abstract Classes trong Dart
Trong Dart, abstract class là một lớp có thể được định nghĩa mà không thể được khởi tạo. Nó cũng có thể chứa các phương thức trừu tượng (abstract method) và các thuộc tính trừu tượng (abstract property).
Một abstract method là một phương thức được khai báo mà không có thân phương thức. Trong abstract class, chúng ta có thể khai báo các abstract method mà không cần định nghĩa chúng. Các lớp con của abstract class phải triển khai (implement) các abstract method này.
Các abstract property cũng tương tự như abstract method. Chúng ta có thể khai báo một abstract property trong abstract class mà không cần định nghĩa giá trị ban đầu của nó. Các lớp con phải định nghĩa giá trị cho abstract property này.
Sử dụng abstract class, chúng ta có thể tạo ra một khuôn mẫu (template) cho các lớp con của nó. Abstract class cũng cho phép chúng ta giả định rằng các lớp con có một số phương thức hoặc thuộc tính nào đó.
Sự khác nhau giữa Abstract Classes và Concrete Classes
Trong Dart, một abstract class là một lớp mà không thể tạo đối tượng trực tiếp. Nó phải được sử dụng như là một lớp cơ sở để kế thừa và triển khai các phương thức trong các lớp con của nó. Các phương thức trong abstract class không có thân hàm (body), chúng chỉ định nghĩa các chữ ký (signature) của phương thức mà lớp con phải cài đặt.
Ngược lại, concrete class là một lớp mà có thể tạo đối tượng trực tiếp và triển khai tất cả các phương thức trong nó. Nó không được khai báo là abstract bằng cách sử dụng từ khóa abstract
.
Vì thế, sự khác biệt chính giữa abstract class và concrete class là:
- Abstract class không thể tạo đối tượng trực tiếp, nhưng concrete class có thể.
- Abstract class có thể chứa các phương thức không có thân hàm (body), trong khi concrete class phải có thân hàm cho tất cả các phương thức của nó.
Ví dụ về abstract class:
abstract class Animal { void makeSound(); // Không có thân hàm } class Dog extends Animal { void makeSound() { print("Gâu gâu"); } } void main() { // Không thể tạo đối tượng Animal trực tiếp // Animal animal = new Animal(); // Tạo đối tượng Dog được kế thừa từ Animal Animal animal = new Dog(); animal.makeSound(); // In ra "Gâu gâu" }
Trong ví dụ này, Animal
là một abstract class có một phương thức makeSound()
không có thân hàm. Lớp Dog
được kế thừa từ Animal
và cài đặt phương thức makeSound()
. Trong hàm main()
, ta không thể tạo đối tượng Animal
trực tiếp, nhưng ta có thể tạo đối tượng Dog
và gán nó cho biến kiểu Animal
. Khi gọi phương thức makeSound()
trên đối tượng animal
, phương thức sẽ được triển khai bởi lớp Dog
và in ra chuỗi “Gâu gâu”.
Quy tắc cho Abstract classes
Các quy tắc của phần tóm tắt được đưa ra dưới đây.
- Một Abstract Classes có thể có một phương thức trừu tượng (phương thức không có thực thi) hoặc không.
- Nếu có ít nhất một phương thức trừu tượng, thì lớp đó phải được khai báo là trừu tượng.
- Đối tượng của Abstract Classes không thể được tạo, nhưng nó có thể được mở rộng.
- Một từ khóa trừu tượng được sử dụng để khai báo Abstract Classes.
- Một Abstract Classes cũng có thể bao gồm các phương thức bình thường hoặc cụ thể (phương thức với phần thân).
- Tất cả các phương thức trừu tượng của lớp cha phải được thực hiện trong lớp con.
Khai báo Abstract Classes
Một từ khóa trừu tượng theo sau là tên lớp được sử dụng để khai báo Abstract Classes. Một Abstract Classes chủ yếu được sử dụng để cung cấp một cơ sở cho lớp con để mở rộng và triển khai phương thức trừu tượng.
Cú pháp:
Abstract Classes ClassName { // Nội dung của Abstract Classes }
Sử dụng Abstract Classes
Giả sử chúng ta có một lớp Person có phương thức displayInfo () , và chúng ta phải các lớp con của nó là Boy and Girl . Thông tin của mỗi người khác nhau so với người kia, vì vậy không có lợi ích gì khi triển khai displayInfo () trong lớp cha. Bởi vì mọi lớp con phải ghi đè phương thức của lớp cha bằng cách cung cấp phương thức triển khai của chính nó. Do đó, chúng ta có thể buộc lớp con cung cấp việc triển khai cho phương thức đó, vì vậy đó là lợi ích khi làm cho phương thức trở nên trừu tượng. Chúng tôi không yêu cầu triển khai give trong lớp cha.
Hãy hiểu tình huống trên thông qua đoạn mã sau.
Ví dụ:
abstract class Person { // khai báo phương thức trừu tượng void displayInfo(); // phương thức trừu tượng } class Boy extends Person { // Phương thức ghi đè void displayInfo() { print("Tên tôi là Boy"); } } class Girl extends Person { // Phương thức ghi đè void displayInfo() { print("Tên tôi là Girl"); } } void main() { Boy b = new Boy(); // Tạo đối tượng của lớp Boy Girl g = new Girl(); // Tạo đối tượng của lớp Girl b.displayInfo(); g.displayInfo(); }
Đầu ra
Tên tôi là Johnathon
Tên tôi là Grecia
Giải trình:
Như chúng ta thấy rằng trong đoạn mã trên, chúng ta đã triển khai phương thức trừu tượng trong hai lớp con theo yêu cầu của nó và sau đó chúng ta gọi phương thức displayInfo () bằng cách sử dụng đối tượng của cả hai lớp.
Xem thêm Chuỗi tùy chọn Swift