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); // 2Lư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.
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ớpStringUtilslà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 operationCountbắ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ăngoperationCountvà trả về chuỗi đã đảo ngược - Một phương thức static
join(String first, String second)tăngoperationCountvà trả về hai chuỗi được nối bằngdefaultSeparator - Một phương thức static
countVowels(String text)tăngoperationCountvà 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
- Một
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 raVowels: [count] - In ra thống kê bằng
getStats()
- Gọi
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: 3Tự 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
}
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