Menu
CoddyTech

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);  // 2

Biế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.

challenge icon

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ớp Exhibit đạ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ả visitorCount của khu trưng bày và totalVisitors của lớp
    • Một phương thức displayStats() in thông tin của khu trưng bày
  • 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'
    Ghi nhận 3 lượt ghé thăm khu Dinosaur Bones, sau đó ghi nhận 2 lượt ghé thăm khu Ancient Egypt. Sau tất cả các lượt ghé thăm, gọi 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.

Phương thức displayStats() cần in theo đúng định dạng sau:

[name]: [visitorCount] visitors

Vớ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: 5

Tự 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]
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Dart online