
1
Chương
Chương 14
14
C
Cà
ài đ
i đặ
ặt c
t cá
ác đ
c đặ
ặc t
c tí
ính đ
nh để
ể
truy xu
truy xuấ
ất c
t cá
ác thu
c thuộ
ộc t
c tí
ính
nh
Nguy
Nguyễ
ễn H
n Hồ
ồng Phương
ng Phương
Khoa CNTT,
Khoa CNTT, ĐHBKHN
ĐHBKHN

2
Quan s
Quan sá
át c
t cấ
ấu tr
u trú
úc bi
c biể
ểu di
u diễ
ễn m
n mộ
ột v
t vị
ịtr
trí
ít
tọ
ọa đ
a độ
ộ
struct ScreenPosition{
public ScreenPosition(int x, int y){
X = rangeCheckedX(x);
Y = rangeCheckedY(y);
}
public int X;
public int Y;
private static int rangeCheckedX(int x){
if(x<0 || x>640){ throw new ArgumentOutOfRangeException(“X”);}
return x;
}
private static int rangeCheckedY(int y){
if(y<0 || y>800){ throw new ArgumentOutOfRangeException(“Y”);}
return y;
}
}

3
Giải quyết vấn đề
•Các trường nên để là private
• Thêm các phương thức lấy/đặt giá trị để
đọc và ghi giá trịcho mỗi trường
struct ScreenPosition{
......
public int GetX(){ return x; }
public void SetX(int newX){ x = rangeCheckedX(newX); }
// tương tựvới y
private static int rangeCheckedX(int x){
......
}
private static int rangeCheckedY(int y){
......
}
private int x,y;
}

4
T
Tồ
ồn t
n tạ
ại
i
•Nếu dùng các phương thức thì phải viết
mã lệnh “dài” hơn là sửdụng các trường.
Ví dụ: tăng giá trịtọa độ X lên 10:
int x = topLeft.GetX();
topLeft.SetX(x+10);
•Mã tương đương nếu trường X là public:
topLeft.X += 10;
• Tuy nhiên, nếu sửdụng trường thì sẽphá
vỡtính đóng của nó.
•Liệu có cách nào kết hợp: giữlại tính đóng
trong khi vẫn cho phép cú pháp giống như
trường ?

5
Kh
Khá
ái ni
i niệ
ệm thu
m thuộ
ộc t
c tí
ính
nh
•Sửdụng thuộc tính giống như cách
dùng trường.
•Vềmặt logic, một thuộc tính giống
như một trường.
•Trình biên dịch sẽtự động chuyển
đổi cú pháp giống trường này vào
lệnh gọi tới các phương thức đặt giá
trị đặc biệt.

