Menu
CoddyTech

Phương thức và trường 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 20 trên 110.

Bây giờ bạn đã hiểu sự khác nhau giữa thành viên instance và thành viên tĩnh, hãy cùng tìm hiểu cách sử dụng phương thức và trường tĩnh hiệu quả. Thành viên tĩnh phù hợp với chức năng thuộc về chính lớp, chứ không phải từng đối tượng riêng lẻ.

Trường tĩnh lưu trữ dữ liệu dùng chung cho mọi đối tượng. Chúng thường được dùng làm bộ đếm, giá trị cấu hình hoặc dữ liệu đã lưu vào bộ nhớ đệm:

class MathHelper {
  static const double pi = 3.14159;
  static int calculationCount = 0;
  
  static double circleArea(double radius) {
    calculationCount++;
    return pi * radius * radius;
  }
}

print(MathHelper.circleArea(5));  // 78.53975
print(MathHelper.circleArea(3));  // 28.27431
print(MathHelper.calculationCount);  // 2

Lưu ý rằng bạn gọi trực tiếp các phương thức tĩnh trên tên lớp, không gọi trên một đối tượng. Lớp MathHelper hoạt động như một tiện ích, bạn không cần tạo đối tượng MathHelper.

Một quy tắc quan trọng: phương thức static không thể truy cập trực tiếp vào các thành viên của instance. Chúng không thể truy cập this vì không gắn với một đối tượng cụ thể nào:

class Counter {
  int value = 0;  // Trường instance
  static int total = 0;  // Trường tĩnh
  
  void increment() {
    value++;  // OK: phương thức instance truy cập trường instance
    total++;  // OK: phương thức instance có thể truy cập trường tĩnh
  }
  
  static void reset() {
    total = 0;  // OK: phương thức tĩnh truy cập trường tĩnh
    // value = 0;  // Lỗi! Không thể truy cập trường instance
  }
}

Hãy dùng thành viên tĩnh khi chức năng không phụ thuộc vào trạng thái của đối tượng. Các hàm tiện ích, việc theo dõi hàm tạo hoặc các hằng số dùng chung đều phù hợp.

challenge icon

Thử thách

Dễ

Hãy tạo một lớp tiện ích cho các thao tác với chuỗi để minh họa cách các phương thức và trường static phối hợp với nhau, cung cấp chức năng hữu ích mà không cần tạo đối tượng.

Bạn sẽ tạo hai tệp để sắp xếp code:

  • string_utils.dart: Định nghĩa lớp StringUtils làm lớp hỗ trợ tiện ích. Lớp của bạn cần có:
    • Một static const String defaultSeparator được đặt thành '-'
    • Một static int operationCount bắt đầu ở 0 để theo dõi số thao tác đã thực hiện
    • Một phương thức static reverse(String text) tăng operationCount và trả về chuỗi đã đảo ngược
    • Một phương thức static join(String first, String second) tăng operationCount và trả về hai chuỗi được nối bằng defaultSeparator
    • Một phương thức static countVowels(String text) tăng operationCount và trả về số nguyên âm (a, e, i, o, u, không phân biệt chữ hoa chữ thường)
    • Một phương thức static getStats() trả về một chuỗi cho biết tổng số thao tác đã thực hiện
  • main.dart: Nhập lớp tiện ích của bạn và dùng các phương thức static của lớp:
    • Gọi reverse() với 'hello' và in ra kết quả
    • Gọi join() với 'dart' và 'lang' rồi in ra kết quả
    • Gọi countVowels() với 'Programming' và in ra Vowels: [count]
    • In ra thống kê bằng getStats()

Nhớ gọi tất cả phương thức trực tiếp trên tên lớp vì chúng là static, bạn sẽ không tạo đối tượng StringUtils.

Phương thức getStats() cần trả về theo định dạng sau:

Operations performed: [operationCount]

Đầu ra dự kiến:

olleh
dart-lang
Vowels: 3
Operations performed: 3

Tự làm thử

import 'string_utils.dart';

void main() {
  // TODO: Gọi reverse() với 'hello' rồi in kết quả ra
  
  // TODO: Gọi join() với 'dart' và 'lang' rồi in kết quả ra
  
  // TODO: Gọi countVowels() với 'Programming' rồi in ra "Vowels: [count]"
  
  // TODO: Dùng getStats() để in số liệu thống kê ra
}
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