Ôn tập: hồ sơ học sinh
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 35 trên 70.
Thử thách
DễHãy xây dựng một hệ thống lưu trữ hồ sơ học sinh, kết hợp tất cả các kỹ thuật đóng gói mà bạn đã học trong chương này. Bạn sẽ tạo một hệ thống bảo mật, trong đó dữ liệu học sinh được bảo vệ đúng cách, điểm số được xác thực và một số thông tin không thể thay đổi sau khi khởi tạo.
Bạn sẽ sắp xếp code trong hai tệp:
Student.cs: Tạo một lớpStudenttrong không gian tênRecordsđể thể hiện cách đóng gói đúng. Lớp học sinh của bạn cần có:- Một trường
readonlyName(chuỗi) có thể được truy cập công khai nhưng chỉ có thể được gán giá trị khi khởi tạo - Một trường
readonlyriêng tư lưu mã học sinh (chuỗi), không thể truy cập trực tiếp từ bên ngoài - Một danh sách riêng tư để lưu điểm số (số nguyên)
- Một thuộc tính chỉ đọc công khai
Averageđể tính và trả về điểm trung bình của tất cả điểm số, hoặc0nếu chưa có điểm nào - Một phương thức công khai
AddGrade(int grade)chỉ chấp nhận điểm từ 0 đến 100 (bao gồm cả hai giá trị này), điểm không hợp lệ sẽ bị bỏ qua mà không thông báo - Một phương thức công khai
GetGradeCount()trả về số điểm hợp lệ đã được ghi nhận - Một phương thức công khai
GetStudentInfo()trả về một chuỗi theo định dạng"{Name} (ID: {last 4 characters of student ID})", hãy chú ý rằng bạn chỉ để lộ phiên bản đã che của mã học sinh!
- Một trường
Program.cs: Trong tệp chính, hãy tạo một học sinh và thêm một vài điểm để minh họa cách tính đóng gói hoạt động. Bạn sẽ cho thấy điểm hợp lệ được chấp nhận, điểm không hợp lệ bị từ chối và điểm trung bình được tính chính xác.
Bạn sẽ nhận năm đầu vào:
- Tên học sinh
- Mã học sinh (ít nhất 4 ký tự)
- Điểm thứ nhất cần thêm (số nguyên)
- Điểm thứ hai cần thêm (số nguyên, có thể không hợp lệ như -5 hoặc 150)
- Điểm thứ ba cần thêm (số nguyên)
In ra kết quả theo định dạng này:
{GetStudentInfo() result}
Grades recorded: {GetGradeCount()}
Average: {Average}Ví dụ: nếu đầu vào là Emma Wilson, STU12345, 85, 150 và 90, kết quả sẽ là:
Emma Wilson (ID: 2345)
Grades recorded: 2
Average: 87.5Hãy chú ý rằng điểm không hợp lệ 150 đã bị bỏ qua mà không thông báo, nên chỉ có hai điểm được ghi nhận. Mã học sinh được bảo vệ, code bên ngoài không thể xem toàn bộ mã, mà chỉ thấy phiên bản đã che thông qua GetStudentInfo(). Tên có thể đọc được nhưng không thể thay đổi. Đây là cách tính đóng gói phối hợp để tạo nên một lớp vững chắc và được bảo vệ tốt!
Tự làm thử
using System;
using Records;
class Program
{
public static void Main(string[] args)
{
// Đọc dữ liệu đầu vào
string name = Console.ReadLine();
string studentId = Console.ReadLine();
int grade1 = Convert.ToInt32(Console.ReadLine());
int grade2 = Convert.ToInt32(Console.ReadLine());
int grade3 = Convert.ToInt32(Console.ReadLine());
// TODO: Tạo đối tượng Student với name và studentId
// TODO: Thêm cả ba điểm bằng phương thức AddGrade
// TODO: In đầu ra theo định dạng yêu cầu:
// {kết quả của GetStudentInfo()}
// Grades recorded: {GetGradeCount()}
// Trung bình: {Average}
}
}
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