Tham chiếu this Khi Khi một một đối đối tượng tượng đang đang thực thực thi thi một một phương phương thức không không phải phải là là phương phương thức thức tĩnh, tĩnh, tham chiếuthis
Trang 1OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 1
Class & Object (tt)
1
Thiết kế và cài đặt lớp & đối tượng
Thiết kế và cài đặt lớp & đối tượng
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 2
8. Tham chiếu this
Khi Khi một một đối đối tượng tượng đang đang thực thực thi thi một một phương phương
thức (không (không phải phải là là phương phương thức thức tĩnh), tĩnh), tham
chiếuthis tự tự động động trỏ trỏ đến đến đối đối tượng tượng này này
Có Có 3 3 trường trường hợp hợp sử sử dụng dụng tham tham chiếu chiếu this::
Tránh Tránh xung xung đột đột tên tên khi khi tham tham số số của của phương phương
thức
thức trùng trùng tên tên với với tên tên biến biến dữ dữ liệu liệu của của Object Object
Dùng Dùng truyền truyền đối đối tượng tượng hiện hiện tại tại làm làm tham tham số số
cho
cho một một phương phương thức thức khác khác (VD (VD gọi gọi đệ đệ qui) qui)
Dùng Dùng với với mục mục đích đích chỉ chỉ mục mục (Index) (Index)
Trang 2OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 3
Vd: this Xem thêm vd trang 25 Xem thêm vd trang 25 26 26
public
public class class Point
{{ private private int int x,y x,y;;
public Point(int ox, int oy)
{{
this
this x x = = ox ox;; // // tương tương đương đương x x = = ox ox;;
this
this y y = = oy oy;; // // tương tương đương đương y y = = oy oy;;
}}
}}
//
// Giả Giả sử sử trong trong hàm hàm Main Main ta ta khai khai báo báo như như sau sau::
Point Point A A = = new Point( Point(3 3,,4 4));;
Note
Note::
Trong trường hợp này tham số truyền cho this
chính đối tượng A Do đó: this.x chính là A.x
Tóm lại:Tham số truyền cho đối this chính là
đối tượng đi kèm với phương thức trong lời gọi
phương thức.
9 Đóng gói dữ liệu với thuộc tính
Thuộc Thuộc tính tính là là khái khái niệm niệm cho cho phép phép truy truy cập cập trạng trạng
thái
thái của của lớp lớp thay thay vì vì thông thông qua qua truy truy cập cập trực trực tiếp tiếp
các
các biến biến thành thành viên, viên, nó nó sẽ sẽ đựơc đựơc thay thay thế thế bằng bằng
việc
việc truy truy cập cập thông thông qua qua phương phương thức thức của của lớp lớp
Nói Nói cách cách khác khác Thuộc Thuộc tính tính là là các các phương phương thức thức lấy lấy
giá
giá trị trị ((get và và gán gán giá giá trị trị ((set ::
Chỉ đọc((read read only only):): chỉ có phương thức get
Chỉ ghi ((write write only only):): chỉ có phương thức set
Vừa đọc vừa ghi ((read/write read/write):): có cả hai phương
thứcget và set
Trang 3OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 5
Khai báo Phương thức cho thuộc tính
public
public <Return_Type> <Return_Type> <Property_name>
{{
//
// phương thức lấy giá trị của thuộc tínhphương thức lấy giá trị của thuộc tính
get
{{ // trả về một giá trị cùng kiểu với biến thành viên
return BiểuThứcTrảVề;
}}
//
// phương thức gán giá trị cho thuộc tínhphương thức gán giá trị cho thuộc tính
set
{{
BiếnThànhViên = value ;;
}}
}}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 6
VD minh họa
Public class Time
{ int _Hour, _Minute, _Second ;
public int Hour
{ set { _Hour = value ; }
get { return _Hour; } }
public int Minute
{ set { _Minute = value ; }
get { return _Minute ; } }
public int Second
{ set { _Second = value ; }
get { return _Second ; } }
}
Trang 4OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 7
VD minh họa Xem thêm vd trang 28 Xem thêm vd trang 28 29 29
Public class CSinhVien
{ string _MaSV, _Ten;
int _NamSinh ;
string _TenNguoiYeu; // No Access-Modifier
public string MaSV
{ // mã sinh viên read-only
get { return _MaSV; } }
public string Ten
{ set { _Ten = value ; }
get { return _Ten ; } }
public int NamSinh
{ set { _NamSinh = value ; }
get { return _NamSinh ; } }
}
10 Toán tử (operator)
Trong Trong C# C# toán toán tử tử làlà một một phương phương thức thức tĩnh tĩnh (static
method) dùng dùng để để quá quá tải tải (overload) một một phép phép
toán
toán nào nào đó đó trên trên các các đối đối tượng tượng
Mục Mục đích đích của của toán toán tử tử là là để để viết viết mã mã chương chương trình trình
gọn
gọn gàng, gàng, dễ dễ hiểu hiểu hơn, hơn, thay thay vì vì phải phải gọi gọi phương phương
thức
thức
Vd Vd:: giả giả sử sử ta ta có có lớp lớp Phân Phân Số Số có có p p thức thức Cong Cong
PhanSo
PhanSo ps ps1 1 = = new PhanSo( PhanSo(2 2,,4 4)) ;;
PhanSo
PhanSo ps ps2 2 = = new PhanSo( PhanSo(1 1,,3 3)) ;;
thay
thay vì vì viết viết:: ps ps3 3 = = ps ps1 1 Cong(ps Cong(ps2 2))
ta
ta viết viết:: PhanSo PhanSo ps ps3 3 = = ps ps1 1 + + ps ps2 2;; nếu nếu ta ta dùng dùng
operator
operator overloaded overloaded
Trang 5OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 9
10 Toán tử (operator) tt
Ta có thể quá tải các toán tử sau:
Toán học: + , Toán học: + , , * , / , % , * , / , %
Cộng trừ một ngôi: ++ , Cộng trừ một ngôi: ++ , ,,
Quan hệ so sánh: == , != , > , < , >= , <=
Ép kiểu: ()
Cú pháp khai báo nguyên mẫu của một toán tử T:
public static KiểuTrảVề operator T (CácThamSố)
{{
//các câu lệnh trong thân toán tử
}}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 10
10 Chú ý quá tải toán tử (operator overloaded)
Tham số của toán tử phải là tham trị (không
dùng các từ khóa ref, out).
Không được quá tải toán tử = (gán), && ,, || (and,
or logic), ?: (điều kiện), checked,, unchecked,,
new,, typeof,, as,, is
[ ] không được xem là một toán tử
Khi quá tải các toán tử dạng: +,, ,, **,, // ,, % thì các
toán tử +=,, = =,, *=,, /= ,, %= được quá tải tự động
Khi quá tải toán tử thì nên quá tải theo cặp đối
ngẫu Chẳng hạn, khi quá tải toán tử == thì quá
tải thêm toán tử != …
Trang 6OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 11
10 Chú ý quá tải toán tử (operator overloaded)
Khi Khi quá quá tải tải toán toán tử tử ==, ==, != != thì thì nên nên phát phát triển triển thêm thêm
các
các phương phương thức thức Equals(),, GetHashCode() để
đảm
đảm bảo bảo luậtluật “hai “hai đối đối tượng tượng bằng bằng nhau nhau theo theo toán toán
tử
tử == == hoặc hoặc phương phương thức thức Equals sẽ sẽ có có cùng cùng mã mã
băm”
Khi Khi định định nghĩa nghĩa toán toán tử tử ép ép kiểu kiểu ta ta phải phải chỉ chỉ ra ra đây đây
là
là toán toán tử tử ép ép kiểu kiểu ngầm ngầm định định (implicit) hay hay tường tường
minh (explicit)
Cú pháp định nghĩa toán tử ép kiểu:
public
public static static [[ implicit || explicit ]] operator KiểuTrảVềT (Type V)
Trong đó Type Vlà biến cần ép sang kiểulà biến cần ép sang kiểu KiểuTrảVềT KiểuTrảVềT
VD minh họa
Public class PhanSo
{
int Tu, Mau;
public PhanSo (int TuSo , int MauSo )
{
Tu = TuSo ;
Mau = MauSo ;
}
public static PhanSo operator + ( PhanSo ps1, PhanSo ps2)
{
int MauMoi = ps1.Mau * ps2.Mau ;
int TuMoi = ps2.Mau * ps1.Tu + ps1.Mau * ps2.Tu;
return new PhanSo(TuMoi, MauMoi);
}
}
Xem thêm vd trang 31
Xem thêm vd trang 31 33 33
Trang 7OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 13
11 Chỉ mục (Index)
Việc Việc định định nghĩa nghĩa chỉ chỉ mục mục cho cho phép phép tạo tạo
các
các đối đối tượng tượng của của lớp lớp hoạt hoạt động động giống giống
như
như một một mảng mảng ảo ảo
Tức Tức là là các các đối đối tượng tượng có có thể thể sử sử dụng dụng
toán
toán tử tử [[ ]] để để truy truy cập cập đến đến một một thành thành
phần
phần dữ dữ liệu liệu nào nào đó đó
Việc Việc định định nghĩa nghĩa chỉ chỉ mục mục tương tương tự tự như như
việc
việc định định nghĩa nghĩa một một thuộc thuộc tính tính
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 14
11 Cú pháp tạo Chỉ mục (Index)
public KiểuTrảVề this [DanhSáchThamSố]
{{ //Hàm đọc
get
{{
// thân hàm đọc
}}
// Hàm ghi
set
{{
// thân hàm ghi
}}
}}
vd trang 34
vd trang 34 35 35
Trang 8OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 15
11 Ghi chú về chỉ mục (Index)
MộtMột chỉ chỉ mục mục phảiphải có có ít ít nhất nhất một một tham tham số, số, và và
tham
tham số số có có thể thể có có kiểu kiểu bất bất kỳ kỳ
Chỉ Chỉ mục mục cócó thể thể chỉ chỉ có có phương phương thứcthức get get
Mặc Mặc dùdù chỉ chỉ mục mục làlà một một đặc đặc điểm điểm thú thú vị vị của của
C#
C# nhưng nhưng cần cần phải phải sử sử dụng dụng đúng đúng mục mục đích đích
(sử
(sử dụng dụng để để đối đối tượng tượng có có thể thể họat họat động động như như
mảng,
mảng, mảng mảng nhiều nhiều chiều) chiều)
Một Một lớp lớp có có thể thể có có nhiềunhiều chỉ chỉ mục mục nhưngnhưng
chúng
chúng phải phải có có các các dấu dấu hiệu hiệu phân phân biệt biệt với với
nhau
nhau (tương (tương tự tự như như quá quá tải tải phương phương thức) thức)
Q&A
Bài tập:
1 Đọc lại bài giảng
2 Làm các bài VD & bài tập trong GT
3 Đọc bài: Kế thừa
4 Buổi tới thảo luận & kiểm tra bài cũ