Kế thừa cơ bản
Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 36 trên 110.
Kế thừa cho phép một lớp có được các thuộc tính và phương thức của một lớp khác. Thay vì viết lại cùng một đoạn code, bạn tạo một lớp mới dựa trên lớp hiện có. Lớp ban đầu được gọi là lớp cha (hay lớp cha), còn lớp mới là lớp con (hay lớp con).
Trong Dart, bạn dùng từ khóa extends để kế thừa từ một lớp cha:
class Animal {
String name;
Animal(this.name);
void eat() {
print('$name is eating');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void bark() {
print('$name says woof!');
}
}
void main() {
var dog = Dog('Buddy');
dog.eat(); // Kế thừa từ Animal
dog.bark(); // Định nghĩa trong Dog
}Lớp Dog tự động có quyền truy cập vào thuộc tính name và phương thức eat() từ Animal, đồng thời có phương thức bark() riêng. Điều này tạo nên mối quan hệ “là một”: Dog là một Animal.
Lớp con có thể thêm thuộc tính và phương thức mới, nhưng kế thừa mọi thành phần công khai từ lớp cha. Lưu ý rằng các thành phần riêng tư (những thành phần có _) không thể được truy cập trực tiếp trong các lớp con thuộc thư viện khác, dù chúng vẫn tồn tại trong đối tượng được kế thừa.
Thử thách
DễHãy xây dựng một hệ thống phương tiện để minh họa cách tính kế thừa cho phép các lớp con dùng lại và mở rộng chức năng của lớp cha. Bạn sẽ tạo một lớp cha dành cho các phương tiện nói chung và một lớp con dành cho một loại phương tiện cụ thể.
Bạn sẽ sắp xếp code thành hai tệp:
vehicle.dart: Định nghĩa các lớp tại đây:- Một lớp
Vehicle(lớp cha) có thuộc tínhString brand, hàm khởi tạo nhận thương hiệu và phương thứcstart()in ra[brand] engine starting... - Một lớp
Motorcyclekế thừaVehicle. Lớp này cần có thêm thuộc tínhint cc(dung tích động cơ), hàm khởi tạo nhận cả thương hiệu và cc (truyền thương hiệu cho lớp cha bằngsuper), cùng phương thức riêngwheelie()in ra[brand] is doing a wheelie!
- Một lớp
main.dart: Nhập tệp phương tiện và minh họa kế thừa trong thực tế:- Tạo một
Vehiclecó thương hiệu'Toyota' - Gọi phương thức
start()của đối tượng này - Tạo một
Motorcyclecó thương hiệu'Harley'và cc là1200 - Gọi phương thức
start()của xe máy (được kế thừa từ Vehicle) - Gọi phương thức
wheelie()của xe máy (được định nghĩa trong Motorcycle) - In ra
Motorcycle engine: [cc]ccđể hiển thị thuộc tính riêng của lớp con
- Tạo một
Hãy chú ý cách lớp Motorcycle tự động có thể truy cập thuộc tính brand và phương thức start() từ Vehicle, đồng thời có thuộc tính cc và phương thức wheelie() riêng. Đây là sức mạnh của tính kế thừa, xây dựng dựa trên code hiện có.
Đầu ra mong đợi:
Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200ccTự làm thử
import 'vehicle.dart';
void main() {
// TODO: Tạo một Vehicle có thương hiệu 'Toyota'
// TODO: Gọi phương thức (method) start() của vehicle
// TODO: Tạo một Motorcycle có thương hiệu 'Harley' và cc là 1200
// TODO: Gọi phương thức start() của motorcycle (kế thừa từ Vehicle)
// TODO: Gọi phương thức wheelie() của motorcycle
// TODO: In ra 'Motorcycle engine: [cc]cc' bằng thuộc tính (property) cc của motorcycle
}
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ề lập trình hướng đối tượng
Tệp bên ngoàiThư viện và câu lệnh importGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcBiến thể hiệnKiến thức cơ bản về hàm khởi tạoÔn tập: Máy tính đơn giản4An toàn với giá trị null
Giới thiệu về an toàn với giá trị nullCó thể null và không thể nullToán tử ? và !Từ khóa late và an toàn với giá trị nullToán tử xử lý nullAn toàn với giá trị null trong lớpÔn tập: hệ thống hồ sơ người dùng7Lớp trừu tượng và interface
Lớp trừu tượngPhương thức trừu tượngInterface trong DartInterface ngầm địnhTriển khai và kế thừaNhiều interfaceÔn tập: Máy tính hình10Bộ sưu tập và kiểu tổng quát
Tổng quan về List, Set và MapBộ sưu tập an toàn về kiểuLớp tổng quátPhương thức tổng quátRàng buộc kiểu tổng quátIterable và IteratorÔn tập: Lưu trữ tổng quát2Hàm khởi tạo trong Dart
Hàm khởi tạo mặc địnhHàm khởi tạo có tênDanh sách khởi tạoHàm khởi tạo hằng sốHàm khởi tạo nhà máyHàm khởi tạo chuyển hướngÔn tập: Trình tạo hình dạng5Đóng gói
Thành viên công khai và riêng tưQuy ước tiền tố _Tính riêng tư ở cấp thư việnTìm hiểu sâu về getter và setterChe giấu thông tinÔn tập: hồ sơ học sinh8Mixin
Giới thiệu về MixinTạo MixinSử dụng nhiều MixinTừ khóa on trong MixinMixin và kế thừaMixin và giao diệnÔn tập: hệ thống động vật3Thuộc tính của lớp
Thành viên instance và thành viên tĩnhTrường final và constBiến latePhương thức và trường tĩnhGetter và setterÔn tập: trình quản lý tài khoản ngân hàng6Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChú thích @overrideTừ khóa lớp finalHàm khởi tạo và kế thừaÔn tập: phân cấp nhân viên9Đa hình
Khái niệm cơ bản về đa hìnhĐa hình qua giao diệnKiểm tra kiểu lúc chạyToán tử is và asTừ khóa hiệp biếnÔn tập: Bộ xử lý thanh toánTự luyện tập: Trình biên dịch Dart online