Nội dung Định nghĩa lớp Khai báo đối tượng và sử dụng Phương thức thiết lập, sao chép Phương thức hủy Nạp chồng phương thức Thành phần tĩnh Nạp chồng toán tử... • Biến đối tượng kh
Trang 1CHƯƠNG 3
Trang 2Mục tiêu
Khai báo được lớp, đối tượng và sử dụng.
Biết cách vận dụng các từ khoá truy cập.
Xây dựng các phương thiết lập, sao chép.
Hàm hủy bỏ,cơ chế thu gom rác
Sử dụng các thành viên tĩnh.
Nạp chồng phương thức.
Trang 3Nội dung
Định nghĩa lớp
Khai báo đối tượng và sử dụng
Phương thức thiết lập, sao chép
Phương thức hủy
Nạp chồng phương thức
Thành phần tĩnh
Nạp chồng toán tử
Trang 43.1 Định nghĩa lớp
[phạm vi truy nhập:]: Là khả năng truy nhập thành
phần dữ liệu (public, private, internal, protected, internal protected)
Trang 5Có thể được truy xuất bởi các phương thức của lớp đó, lớp dẫn xuất từ lớp đó và các lớp trong
Trang 6Ví dụ định nghĩa lớp
Trang 7// khai báo thuộc tính class2// khai báo các phương thức class2}
}
Trang 83.2 Khai báo đối tượng và sử dụng
Đối tượng là biến kiểu tham chiếu, không phải tham
trị
• Biến đối tượng không chứa giá trị của đối tượng
• Biến chứa địa chỉ của đối tượng được tạo trong
bộ nhớ Heap
<tên lớp> <tên đối tượng> = new <tên lớp> ([các giá trị khởi tạo nếu có])
Sử dụng từ khóa “new”
Trang 9Ví dụ
Trang 10Truy nhập phương thức
<tên đối tượng> <tên phương thức> ([danh
sách các đối số nếu có])
Trang 113.3 Phương thức thiết lập, sao chép
Khởi tạo một đối tượng -> gọi phương thức thiết lập
(constructor)
• Phương thức thiết lập mặc định: sẽ được CLR cung
cấp nếu người lập trình không định nghĩa
• Phương thức thiết lập do người lập trình định nghĩa
Phương thức thiết lập có chức năng:
• Tạo một đối tượng của lớp và chuyển nó sang trạng
thái xác định (valid state)
• Phương thức thiết lập thường được dùng để khởi gán
các thuộc tính của đối tượng
Trang 12‘\0’ (null) char
false bool
0 Numeric (int, long,…)
Giá trị mặc định Kiểu dữ liệu
Trang 13Xây dựng phương thức thiết lập
Phương thức thiết lập có tên trùng với tên đối
tượng, không có kiểu dữ liệu trả về và phạm vi truynhập thường là public
Có thể có nhiều phương thức thiết lập trong cùng
lớp
Phương thức thiết lập có thể có tham số hoặc
không
public Class_name()public Class_name( argument list )
Trang 14Ví dụ
Trang 15Phương thức thiết lập sao chép
Phương thức thiết lập sao chép khởi gán giá trị cho
đối tượng mới bằng cách sao chép dữ liệu của đốitượng đã tồn tại (cùng kiểu)
Xây dựng phương thức thiết lập sao chép
• Dùng interface ICloneable của NET
• Tự xây dựng phương thức thiết lập sao chép
(hand-copying copy constructor)
Trang 16Dùng interface ICloneable của NET
Class hỗ trợ hàm tạo sao chép phải
implement interface ICloneable
public Object Clone()
{
return MemberwiseClone(); // shallow copy}
Trang 17Ví dụ
Trang 18Tạo phương thức thiết lập sao chép (1)
Tên hàm trùng với tên lớp
<Tên_lớp> <đối tượng2> = new
<Tên_lớp> (đối tượng1);
Trang 19Ví dụ
Trang 20Tạo phương thức thiết lập sao chép (2)
Tên hàm trùng với tên lớp
• Khai báo
public void saochep (<tên lớp> <đối tượng1>)
{this.gt1 = <đối tượng1>.gt1;
this.gt2 = <đối tượng1>).gt2;
}
• Sử dụng
<đối tượng2>.saochep (đối tượng1);
Trang 21Ví dụ
Trang 22Từ khóa This (1)
Từ khóa this trỏ đến thể hiện hiện tại (current
instance) của đối tượng
Từ khóa this rất hữu ích trong một số trường hợp
• Chỉ rõ thành phần (thuộc tính) của đối tượng,
tránh nhầm lẫn với tên biến, tránh sự nhậpnhằng về tên
public void SomeMethod (int hour)
{
this.hour = hour;
}
Trang 23Từ khóa This (2)
• Dùng làm tham số truyền vào cho một phương
thức của đối tượng khác, cho phép phương thức
đó có thể tác động đến các thành phần của đốitượng hiện tại
class myClass {
public void Foo(OtherClass otherObject)
{
otherObject.Bar(this);
} }
Trang 24Từ khóa This (3)
• Sử dụng cùng với indexer (Tìm hiểu thêm)
• Gọi một hàm tạo từ hàm tạo khác của lớp
class myClass {
public myClass(int i) { // } public myClass( ) : this(42) { // } }
Trang 25}
Trang 26… base.Finalize();
}
~ Classname()
{
… }
≈
Trang 27Hủy đối tượng
C# hỗ trợ cơ chế tự động thu gom rác (garbage
collector) -> người lập trình không phải hủy đốitượng một cách tường minh
Nếu đối tượng có sử dụng các tài nguyên khác
(files…) -> người lập trình phải tự xây dựng phươngthức hủy (Destructor)
Bộ thu gom rác tự động gọi hàm hủy, các phương
thức không gọi một cách tường minh.j
Trang 28Truyền tham số cho phương thức
Mặc định, tham số truyền cho phương thức là kiểu
tham trị
• Một bản sao của tham số đó được tạo ra
• Bản sao đó sẽ bị hủy khi kết thúc phương thức
• Giá trị của tham số được truyền không thay đổi
sau khi kết thúc phương thức
public int AddValue(int value1, int value2)
{
return value1+value2;
}
Trang 29Truyền tham chiếu
C# hỗ trợ truyền tham chiếu sử dụng các từ khóa
• ref: truyền tham chiếu, biến được tham chiếu
phải được khởi gán trước khi truyền
• out: truyền tham chiếu, biến được tham chiếu
không cần khởi gán trước khi truyền
Trang 30Ví dụ (ref)
Trang 31Ví dụ (out)
Trang 32Đóng gói dữ liệu thành các thuộc tính (1)
Lợi ích của đóng gói dữ liệu:
• Vẫn đảm bảo một giao diện đơn giản cho các đối
tượng khác giao tiếp
• Dễ dàng thay đổi mã mà không ảnh hưởng tới
giao diện với các đối tượng khác
• Tăng tính an toàn dữ liệu, kiểm tra được dữ liệu
khi gán
Trang 33Đóng gói dữ liệu thành các thuộc tính (2)
Đóng gói dữ liệu thành thuộc tính thực chất là một
quá trình lấy giá trị của biến thành phần / thiết
lập giá trị cho biến thành phần thông qua phương thức của lớp mà không qua đối tượng
Trong C# cung cấp khả năng khai báo hàm chung
gọi là thuộc tính cho hàm get và set
Trang 34Ví dụ
class time {
private int hour ; public int Hour () {
get { return hour ; }
set {
hour = value;
} }
Lấy giá trị của
thuộc tính
Thiết lập giá trị
cho thuộc tính
Trang 35Ví dụ
class Program {
static void Main(string[] args) {
time t=new time() ;
t.Hour =10; // set t.Xuat();
int a = t.Hour; //set Console.WriteLine(a);
Console.ReadKey();
} }
Thiết lập giá trị
cho thuộc tính
hour của class
time
Trang 363.5 Nạp chồng phương thức
Khi muốn có nhiều phương thức (hàm) cùng tên
hay nhiều hàm với tham số đầu vào khác nhau →
sử dụng kỹ thuật chồng hàm (Overloading)
Để phân biệt được hai hàm với nhau, phải căn cứ
vào một trong hai yếu tố
• Khác tên
• Khác số tham số hoặc kiểu dữ liệu của tham số
void myMethod(int p1);
void myMethod(int p1, int p2);
void myMethod(int p1, string s1);
Trang 37Ví dụ
Trang 38• C# không cho phép truy xuất các thành phần tĩnh
thông qua đối tượng (thể hiện của lớp)
• Các thành phần tĩnh có thể được truy nhập, triệu gọi
trước khi các đối tượng của lớp đó được tạo ra
• Các phương thức tĩnh không thể truy xuất trực tiếp
các thuộc tính, phương thức không tĩnh (nonstatic)
Trang 39Ví dụ
Trang 403.7 Nạp chồng toán tử (1)
Mục đích của nạp chồng toán tử (OverloadingOperator)
• Cho phép các lớp do người dùng định nghĩa có thể có
các chức năng như các kiểu do ngôn ngữ định nghĩa.
• Mục đích của toán tử là để viết mã chương trình gọn
gàng, dễ hiểu hơn, thay vì phải gọi phương thức.
• VD: 1 lớp phân số, có thể có đầy đủ các phép toán
Cộng
Trừ
Nhân
Chia…
Trang 41Nạp chồng toán tử (2)
• KDL: kiểu_dữ_liệu
• T: Phép_toán
Ví dụ: nạp chồng toán tử (+) cho class PhanSo
public static KDL operator T (KDL lhs, KDL rhs)
public static PhanSo operator +(PhanSo lhs, PhanSo rhs)
Trang 42Bài tập chương 3