3.1.3.Thành phần “access-modifiers” Thành phần access- modifiers gọi là phương thức truy cập quyết định khả năng các phương thức của lớp bao gồm việc các phương thức của lớp khác có th
Trang 1Ngôn ngữ lập trình C#
Trang 2CHƯƠNG 3 LỚP - ĐỐI TƯỢNG
Trang 3CHƯƠNG 3 LỚP - ĐỐI TƯỢNG (tt)
Hủy đối tượng
Trang 53.1.1 Khái niệm về lớp
Lớp là một kiểu dữ liệu có cấu trúc dùng để biểu
diễn kiểu dữ liệu trừu tượng
Trang 6int TrongLuong; int ChieuCao;
string MauMat; string MauLong; void An() { … } void Ngu() {…}
void LeoTreo() {…} }
Trang 7Tên lớp Thân
lớp
Trang 8} public class Tester {
static void Main( ) {
Time t = new Time( );
t.DisplayCurrentTime( );
} }
Trang 93.1.3.Thành phần “access-modifiers”
Thành phần access- modifiers (gọi là phương thức truy cập)
quyết định khả năng các phương thức của lớp bao gồm việc
các phương thức của lớp khác có thể nhìn thấy và sử dụng các biến thành viên hay những phương thức bên trong lớp
[attributes] [access-modifiers] class identifier [:base-class]
{class-body}
public Class A {
….
}
public Class B {
….
}
Nhìn thấy
Trang 113.1.3.Thành phần “access-modifiers” (tt)
public: Những thành viên được khai báo với từ khoá public
có thể được sử dụng bởi bất kỳ lớp nào
private: Thành viên trong một lớp A được khai báo với từ khoá là private thì chỉ được truy cập bởi các phương thức của lớp A
protected: Thành viên trong lớp A được khai báo với từ
khoá là protected thì chỉ được các phương thức bên trong lớp A và những phương thức dẫn xuất (derived) từ lớp A truy cập
Trang 123.1.3.Thành phần “access-modifiers”
internal: Thành viên trong lớp A được khai báo với từ khoá là
internal thì được truy cập bởi những phương thức của bất
cứ lớp nào trong cùng khối hợp ngữ (assembly) với A
protected internal: Thành viên trong lớp A được khai báo với
từ khoá là protected internal thì được truy cập bởi các
phương thức của lớp A, các phương thức của lớp dẫn xuất của A, và bất cứ lớp nào trong cùng khối hợp ngữ của A
Trang 143.1.4 Đối số của phương thức
Khi định nghĩa một phương thức, thông thường phải khai
báo các đối số (hay tham số) cho các phương thức đó
Số lượng của đối số trong một phương thức có thể tuỳ ý
Trang 153.1.4 Đối số của phương thức (tt)
Phương thức:
Khai báo một phương thức có đối số:
Khai báo kiểu trả về của phương thức
Tên của phương thức
Sau phần tên của phương thức là danh sách các đối số được đặt trong cặp dấu ngoặc đơn Đứng trước mỗi đối số là kiểu dữ liệu của đối số đó
Trang 163.1.4 Đối số của phương thức (tt)
int howManyPeople = 5; float pi = 3.14f;
MyClass mc = new MyClass( );
mc.SomeMethod(howManyPeople, pi);
}
}
Trang 173.2 Đối tượng (object)
Đối tượng là một thể hiện của lớp, nó là một kiểu dữ liệu
tham chiếu và được tạo ở trong bộ nhớ heap
Để tạo một đối tượng ta sử dụng từ khoá new
Ví dụ: Tạo một đối tượng của lớp Time()
Time t = new Time( );
Trang 183.3 Bộ tạo (Constructors)
Bộ tạo (hàm tạo) là một
phương thức của lớp
Chức năng của hàm
tạo là tạo ra một đối
tượng đặc biệt của lớp
và hàm tạo có tên trùng
với tên của lớp chứa nó
Hàm tạo không có kiểu
System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”, Month, Date, Year, Hour, Minute, Second);
} public Time(System.DateTime dt) {
int Year; int Month;
int Date; int Hour;
int Minute; int Second;
} public class Tester {
static void Main( ) {
System.DateTime currentTime = System.DateTime.Now; Time t = new Time(currentTime);
t.DisplayCurrentTime( );
} }
Trang 19int Year; int Month;
int Date; int Hour;
int Minute; int Second;
Trang 203.4 Các bộ khởi tạo (Initializers)
Có thể khởi tạo các giá trị ban đầu cho các biến thành viên
thông qua bộ khởi tạo
Để thực hiện việc khởi tạo, chúng ta chỉ cần gán giá trị ban
đầu cho các thành viên của lớp thông qua lệnh gán
Ví dụ:
private int Second = 30; // Bộ khởi tạo
Trang 213.5 Bộ tạo sao chép
Bộ tạo (hàm tạo) sao chép thực hiện việc tạo một đối tượng
mới bằng cách sao chép tất cả các biến từ một đối tượng cùng kiểu đã có
public Time(Time existingTimeObject)
Trang 223.6 Từ khoá this
Mỗi phương thức có thể tham chiếu đến những phương
thức và các biến thành viên khác của đối tượng đó (không
có thuộc tính static) thông qua tham chiếu this
Trang 243.7 Sử dụng các thành viên tĩnh (static)
Những thuộc tính và phương thức trong một lớp có thể
là những thành viên thể hiện (instance members) hay những thành viên tĩnh (static members)
Những thành viên thể hiện là sự kết hợp các thể hiện của một kiểu dữ liệu
Những thành viên tĩnh được xem như một phần của
lớp Chúng ta có thể truy cập đến thành viên tĩnh của một lớp thông qua tên lớp đã được khai báo
Trang 253.7 Sử dụng các thành viên tĩnh (static)
Ví dụ:
- Giả sử rằng có một lớp tên Button
- Trong đó có hai thành viên (đối tượng) thể hiện là
Chứ không được viết: btnUpdate.SomeMethod();
Hay viết: btnDelete.SomeMethod();
Trang 263.7.1 Gọi một phương thức tĩnh
Phương thức tĩnh không thể truy cập trực tiếp đến các
thành viên không có tính chất tĩnh (nonstatic)
Chẳng hạn, phương thức Main() là một phương thức tĩnh
Do đó Main() không thể gọi một phương thức không tĩnh bên trong lớp
Trang 283.7.2 Sử dụng bộ tạo tĩnh
Nếu một lớp khai báo một bộ tạo tĩnh (static constructor), thì
chắc chắn rằng phương thức khởi tạo tĩnh này sẽ được
thực hiện trước bất cứ thể hiện nào của lớp được tạo ra
Trang 29- Cuối cùng thêm vào dòng lệnh DisplayCurrentTime(), như sau:
public void DisplayCurrentTime( )
Trang 303.7.2 Sử dụng bộ tạo tĩnh (tt)
Mặc dù chương trình thực hiện tốt, nhưng không cần thiết
phải tạo ra bộ khởi dựng tĩnh để phục vụ cho mục đích này Thay vào đó ta có thể dùng chức năng khởi tạo biến thành viên như sau:
private static string Name = “Time”;
Tuy nhiên, bộ khởi tạo tĩnh có hữu dụng khi chúng ta cần
cài đặt một số công việc mà không thể thực hiện được
thông qua chức năng khởi dựng và công việc cài đặt này chỉ được thực hiện duy nhất một lần
Trang 31instances++;
} public static void HowManyCats( ) {
Console.WriteLine(“{0} cats adopted”, instances);
} private static int instances = 0;
} public class Tester {
static void Main( ) {
Trang 323.7.4 Sử dụng bộ tạo riêng tư (Private)
C# không có phương thức toàn cục và hằng số toàn cục
Do vậy cần phải tạo ra những lớp tiện ích nhỏ chỉ để chứa các phương thức tĩnh Để tạo một lớp tiện ích như vậy thì cần phải tạo ra bộ tạo không có tham số và không làm gì
cả, tức là bên trong thân của phương thức là rỗng, và
thêm vào đó phương thức này phải được khai báo với từ khoá là private
Trang 333.8 Hủy đối tượng
Phương thức hủy nhằm mục đích giải phóng các tài nguyên
C# cung cấp một phương thức ngầm định để thực hiện điều
khiển công việc này, đó là Finalize() hay còn gọi là bộ kết thúc
Trang 343.8.1 Bộ huỷ của C# (Destructor )
Để khai báo một bộ huỷ trong C# thường sử dụng cú pháp
finally { base.Finalize( );
} }
Tên
lớp
bị
huỷ
Trang 353.8.2 Phương thức Dispose
Nếu muốn xử lý các tài nguyên không kiểm soát và muốn
được đóng hay giải phóng các tài nguyên thì cần phải thực thi giao diện IDisposable
Giao diện IDisposable yêu cầu những thành phần thực thi
của nó định nghĩa một phương thức tên là Dispose() để thực
hiện công việc dọn dẹp được yêu cầu
Ý nghĩa của phương thức Dispose() là cho phép chương
trình thực hiện các công việc dọn dẹp hay giải phóng tài
nguyên mong muốn mà không phải chờ cho đến khi phương thức Finalize() được gọi
Trang 363.8.2 Phương thức Dispose (tt)
class Testing : IDisposable
{
bool is_disposed = false;
protected virtual void Dispose(bool disposing)
Trang 373.8.3 Phương thức Close
Khi xây dựng các đối tượng, có thể sử dụng phương thức
Close(), vì phương thức Close() có vẻ tự nhiên hơn phương thức Dispose() trong trường hợp các đối tượng có liên quan đến xử lý tập tin
Có thể xây dựng phương thức Dispose() với thuộc tính là
private và phương thức Close() với thuộc tính public Trong phương thức Close() đơn giản là gọi thực hiện phương
thức Dispose()
Trang 383.8.4 Câu lệnh using
Khi xây dựng các đối tượng, chúng ta không thể chắc chắn rằng người sử dụng gọi phương thức Dispose() hay không, cũng không kiểm soát được lúc nào thì bộ thu gom (garbage collector) thực hiện việc dọn dẹp
Do đó để cung cấp khả năng mạnh hơn để kiểm soát việc
giải phóng tài nguyên thì C# đưa ra cú pháp chỉ dẫn using,
cú pháp này đảm bảo phương thức Dispose() sẽ được gọi sớm nhất nếu có thể được
Trang 393.8.4 Câu lệnh using (tt)
Sử dụng:
Đầu tiên khai báo các đối tượng với cú pháp using
Sau đó tạo một phạm vi hoạt động cho các đối tượng
này trong khối được bao bởi dấu ({})
Khi khối phạm vi này kết thúc, thì phương thức
Dispose() của đối tượng sẽ được gọi một cách tự động
Trang 40} //trình biên dịch gọi Dispose trên theFont
Font anotherFont = new Font(“Courier”,12.0f);
Trang 413.9 Truyền tham số
Truyền tham chiếu
Truyền tham chiếu với biến chưa khởi tạo
Trang 423.9.1 Truyền tham chiếu
Những phương thức có thể trả về một giá trị hoặc tập
hợp các giá trị Nếu muốn phương thức trả về nhiều hơn một giá trị thì ta tạo các tham số dưới hình thức tham
chiếu
Trang 433.9.1 Truyền tham chiếu
public class Time
{
public void DisplayCurrentTime( )
{ System.Console.WriteLine(“{0}/
{1}/{2} {3}:{4}:{5}”, Month, Date, Year,
Hour, Minute, Second);
private int Month;
private int Date;
private int Hour;
private int Minute;
private int Second;
}
Trang 443.9.1 Truyền tham chiếu
public class Tester
}
}
Trang 453.9.2 Truyền tham chiếu với biến chưa khởi tạo
Ngôn ngữ C# bắt buộc phải thực hiện một phép gán cho
biến trước khi sử dụng
Để mở rộng trong trường hợp này ngôn ngữ C# cung cấp
thêm một bổ sung tham chiếu là out
Khi sử dụng tham chiếu out thì yêu cầu bắt buộc phải khởi
tạo các tham số tham chiếu được bỏ qua
Trang 463.10 Nạp chồng phương thức
Khi xây dựng các lớp, thường mong muốn là tạo ra nhiều
phương thức có cùng tên, nhưng thực hiện các chức năng khác nhau
“tham số khác nhau”: khác nhau về mặt số lượng hay về
kiểu dữ liệu của các tham số đó Khi sử dụng một phương thức nào đó, dựa vào danh sách các tham số mà chương trình sẽ thực hiện với những chức năng riêng cho phù hợp
Trang 483.11 Đóng gói dữ liệu với đặc tính thuộc tính
Thuộc tính cung cấp khả năng bảo vệ
các trường dữ liệu bên trong một lớp
Mục đích của thuộc tính nhằm cung
cấp một giao diện đơn giản cho phép
truy cập các biến thành viên, nhưng
che dấu dữ liệu
Để khai báo một thuộc tính, viết kiểu
và tên thuộc tính, theo sau là cặp dấu
móc đơn {} Bên trong cặp dấu móc
đơn khai báo toán tử truy cập get và
set
public int Hour {
get { return hour;
} set { hour = value;
} }
Trang 493.12 Các trường chỉ đọc
dụng các từ khóa readonly
public static readonly int Year;
public static readonly int Month;