Thành viên instance và thành viên tĩnh
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 17 trên 110.
Trong các lớp Dart, thành viên (biến và phương thức) có thể thuộc về từng đối tượng riêng lẻ hoặc thuộc về chính lớp đó. Hiểu rõ sự khác biệt này là điều cơ bản để tổ chức code hiệu quả.
Thành viên instance thuộc về từng đối tượng bạn tạo. Mỗi đối tượng có bản sao riêng của các biến instance, còn các phương thức instance thao tác trên dữ liệu của chính đối tượng đó:
class Dog {
String name; // Biến instance
Dog(this.name);
void bark() { // Phương thức instance
print('$name says woof!');
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
dog1.bark(); // Buddy says woof!
dog2.bark(); // Max says woof!Mỗi đối tượng Dog có name riêng. Đổi tên một chú chó không ảnh hưởng đến những chú chó khác.
Thành viên tĩnh thuộc về chính lớp, không thuộc về một đối tượng cụ thể nào. Chúng được chia sẻ giữa mọi thực thể và được truy cập bằng tên lớp:
class Dog {
String name;
static int totalDogs = 0; // Biến tĩnh
Dog(this.name) {
totalDogs++;
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
print(Dog.totalDogs); // 2Biến totalDogs dùng chung, chỉ có một bản sao dù có bao nhiêu đối tượng Dog. Bạn truy cập biến này qua tên lớp Dog.totalDogs, không phải qua một instance.
Thử thách
DễHãy xây dựng hệ thống đếm khách tham quan cho một bảo tàng, theo dõi cả số lượt ghé thăm từng khu trưng bày và thống kê chung của bảo tàng.
Bạn sẽ sắp xếp code thành hai tệp:
exhibit.dart: Định nghĩa lớpExhibitđại diện cho một khu trưng bày trong bảo tàng. Mỗi khu trưng bày cần có:- Một biến instance
name(String) lưu tên khu trưng bày - Một biến instance
visitorCount(int), bắt đầu từ0, để theo dõi số người đã ghé thăm khu trưng bày cụ thể này - Một biến static
totalVisitors(int), bắt đầu từ0, để theo dõi tổng số lượt ghé thăm ở tất cả các khu trưng bày - Một hàm khởi tạo nhận tên khu trưng bày
- Một phương thức
recordVisit()tăng cảvisitorCountcủa khu trưng bày vàtotalVisitorscủa lớp - Một phương thức
displayStats()in thông tin của khu trưng bày
- Một biến instance
main.dart: Nhập lớp khu trưng bày và tạo hai khu trưng bày:- Một khu trưng bày
'Dinosaur Bones' - Một khu trưng bày
'Ancient Egypt'
displayStats()trên từng khu trưng bày theo thứ tự chúng được tạo, rồi in tổng số khách tham quan ở tất cả các khu trưng bày.- Một khu trưng bày
Phương thức displayStats() cần in theo đúng định dạng sau:
[name]: [visitorCount] visitorsVới dòng tổng số khách tham quan, hãy in:
Total museum visitors: [totalVisitors]Truy cập biến static bằng tên lớp Exhibit.totalVisitors.
Đầu ra mong đợi:
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5Tự làm thử
import 'exhibit.dart';
void main() {
// TODO: Tạo khu trưng bày 'Dinosaur Bones'
// TODO: Tạo khu trưng bày 'Ancient Egypt'
// TODO: Ghi nhận 3 lượt tham quan khu trưng bày Dinosaur Bones
// TODO: Ghi nhận 2 lượt tham quan khu trưng bày Ancient Egypt
// TODO: Gọi displayStats() trên từng khu trưng bày theo thứ tự
// TODO: In ra tổng số khách tham quan bảo tàng bằng Exhibit.totalVisitors
// Định dạng: Total museum visitors: [totalVisitors]
}
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