Trường và phương thức tĩnh
Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 12 trên 70.
Đến giờ, mọi thuộc tính và phương thức mà chúng ta tạo đều thuộc về từng đối tượng riêng lẻ. Nhưng đôi khi, bạn cần dữ liệu hoặc hành vi thuộc về chính lớp và được chia sẻ giữa mọi instance. Đó là lúc từ khóa static phát huy tác dụng.
Trường tĩnh được dùng chung bởi tất cả đối tượng của một lớp. Chỉ có một bản sao duy nhất, bất kể bạn tạo bao nhiêu instance:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}Mỗi khi tạo một Player mới, TotalPlayers tăng lên. Tất cả người chơi dùng chung bộ đếm này.
Một phương thức tĩnh (static method) thuộc về lớp (class) và bạn có thể gọi mà không cần tạo đối tượng (object):
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// Gọi trên lớp (class), không phải trên instance
int result = Calculator.Add(5, 3);Lưu ý rằng bạn truy cập các thành viên tĩnh (static member) bằng tên lớp, không phải bằng tham chiếu đến đối tượng. Phương thức tĩnh (static method) không thể truy cập các trường của instance hoặc dùng this, vì chúng không thuộc về một đối tượng cụ thể nào.
Bạn đã dùng các thành viên tĩnh (static members) mà không nhận ra. Console.WriteLine() là một phương thức tĩnh (static method), còn Math.PI là một trường tĩnh (static field).
Thử thách
DễHãy xây dựng một hệ thống theo dõi đơn hàng sử dụng các thành viên tĩnh để theo dõi tất cả đơn hàng được tạo trong ứng dụng của bạn.
Bạn sẽ tạo hai tệp để sắp xếp code:
Order.cs: Định nghĩa lớpOrdertrong không gian tênOrderSystem. Mỗi đơn hàng cần có thuộc tính của instanceOrderId(int) vàCustomerName(string). Lớp cũng cần theo dõi tổng số đơn hàng đã tạo bằng trường tĩnhTotalOrders, đồng thời cung cấp phương thức tĩnhGetNextOrderId()để trả về mã đơn hàng khả dụng tiếp theo, bắt đầu từ 1. Hàm khởi tạo cần nhận tên khách hàng, tự động gán mã đơn hàng bằng phương thức tĩnh và tăng tổng số đơn hàng.Program.cs: Trong tệp chính, hãy tạo đơn hàng dựa trên đầu vào và hiển thị thông tin chi tiết của chúng cùng với tổng số đơn hàng.
Bạn sẽ nhận được hai đầu vào là tên khách hàng của hai đơn hàng riêng biệt.
Với mỗi đơn hàng, hãy in thông tin chi tiết theo định dạng sau:
Order #{OrderId} - Customer: {CustomerName}Sau khi tạo cả hai đơn hàng, hãy in tổng số đơn hàng:
Total Orders: {TotalOrders}Ví dụ, nếu đầu vào là Alice và Bob, đầu ra sẽ là:
Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2Tự làm thử
using System;
using OrderSystem;
class Program
{
public static void Main(string[] args)
{
// Đọc tên khách hàng
string customer1 = Console.ReadLine();
string customer2 = Console.ReadLine();
// TODO: Tạo hai đối tượng Order với tên khách hàng
// TODO: In ra thông tin chi tiết của từng đơn hàng theo định dạng:
// Order #{OrderId} - Customer: {CustomerName}
// TODO: In ra tổng số đơn hàng theo định dạng:
// Total Orders: {TotalOrders}
}
}
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
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợpTự luyện tập: Trình biên dịch C# online