Chương 4: XÂY DỰNG LỚP ĐỐI TƯỢNG
4.7 Đóng gói dữ liệu với thành phần thuộc tính
Thuộc tính là khái niệm cho phép truy cập trạng thái của lớp thay vì thông qua truy cập trực tiếp các biến thành viên, nó sẽ đựơc thay thế bằng việc thực thi truy cập thông qua phương thức của lớp.
Đây thật sự là một điều lý tưởng. Các thành phần bên ngoài (client) muốn truy cập trạng thái của một đối tượng và không muốn làm việc với những phương thức. Tuy nhiên, người thiết kế lớp muốn dấu trạng thái bên trong của lớp mà anh ta xây dựng, và cung cấp một cách gián tiếp thông qua một phương thức.
Thuộc tính là một đặc tính mới được giới thiệu trong ngôn ngữ C#. Đặc tính này cung cấp khả năng bảo vệ các trường dữ liệu bên trong một lớp bằng việc đọc và viết chúng thông qua thuộc tính. Trong ngôn ngữ khác, điều này có thể được thực
hiện thông qua việc tạo các phương thức lấy dữ liệu (getter method) và phương thức thiết lập dữ liệu (setter method).
Thuộc tính được thiết kế nhắm vào hai mục đích: cung cấp một giao diện đơn cho phép truy cập các biến thành viên, Tuy nhiên cách thức thực thi truy cập giống như phương thức trong đó các dữ liệu được che dấu, đảm bảo cho yêu cầu thiết kế hướng đối tượng. Để hiểu rõ đặc tính này ta sẽ xem ví dụ 4.11 bên dưới:
Ví dụ 4.11: Sử dụng thuộc tính.
--- using System;
public class Time {
public void DisplayCurrentTime() {
Console.WriteLine(“Time\t: {0}/{1}/{2} {3}:{4}:{5}”, date, month, year, hour, minute, second);
}
public Time( System.DateTime dt) {
year = dt.Year; month = dt.Month; date = dt.Day;
hour = dt.Hour; minute = dt.Minute; second = dt.Second; }
public int Hour { get { return hour; } set { hour = value; } }
private int year; private int month; private int date; private int hour; private int minute; private int second; }
public class Tester {
static void Main() {
System.DateTime currentTime = System.DateTime.Now; Time t = new Time( currentTime );
t.DisplayCurrentTime();
// Lấy dữ liệu từ thuộc tính Hour int theHour = t.Hour;
Console.WriteLine(“ Retrieved the hour: {0}”, theHour); theHour++;
t.Hour = theHour;
Console.WriteLine(“Updated the hour: {0}”, theHour); }
}
--- Kết quả:
Time : 2/1/2003 17:55:1 Retrieved the hour: 17 Updated the hour: 18
---
Để khai báo thuộc tính, đầu tiên là khai báo tên thuộc tính để truy cập, tiếp theo là phần thân định nghĩa thuộc tính nằm trong cập dấu ({}). Bên trong thân của thuộc tính là khai báo hai bộ truy cập lấy và thiết lập dữ liệu:
public int Hour {
{ return hour; } set { hour = value; } }
Mỗi bộ truy cập được khai báo riêng biệt để làm hai công việc khác nhau là lấy hay thiết lập giá trị cho thuộc tính. Giá trị thuộc tính có thể được lưu trong cơ sở dữ liệu, khi đó trong phần thân của bộ truy cập sẽ thực hiện các công việc tương tác với cơ sở dữ lịêu. Hoặc là giá trị thuộc tính được lưu trữ trong các biến thành viên của lớp như trong ví dụ: private int hour;