Thứ sáu, ngày 15 tháng 12 năm 2017

C# hướng đối tượng - ĐỐI TƯỢNG VÀ LỚP_2

Ngày đăng: 8/4/2011, 23:3:53PM | Lượt xem: 21,103
Hot!

Hàm hủy bỏ (destructor)Dùng để giải phóng vùng nhớ đã cấp phát cho đối tượng khi mà đối tuợng không còn được tham chiếu đến

1.  Hàm hủy bỏ (destructor)

Dùng để giải phóng vùng nhớ đã cấp phát cho đối tượng khi mà đối tuợng không còn được tham chiếu đến. Hàm hủy bỏ là một hàm không có giá trị trả vềtên trùng tên với class và có thêm kí tự “~”ở trước. Muốn khai báo một destructor chúng ta khai báo nó với cú pháp như sau:

class className{

public ~className()

public classname
	{
		public classname()
		{
			// code of constructor
			// các công việc cần thực hiện
                }
               ~ classname()
                {
	                // code of descontructor
	                // các công việc cần thực hiện
                }
	}


Tuy nhiên, trong ngôn ngữ C# thì cú pháp khai báo trên là một shortcut liên kết đến một phương thức kết thúc Finalize được kết với lớp cơ sở, do vậy khi viết

~ classname()

   {

// Thực hiện một số công việc

}

Và viết :

class1.Finalize()

{

// Thực hiện một số công việc

base.Finalize();

}

Thì hai cách viết như thế này sẽ được C# hiểu là như nhau.

Trong C# có một đối tượng hỗ trợ cho công việc dọn rác mỗi khi đối tượng không còn được tham chiếu đến là đối tượng GC (garbage collector). Đối tượng này thực hiện công việc rọn rác qua 3 bước như sau:

         - Tìm kiếm những đối tượng không còn được tham chiếu nữa

- Cố gắng các hoạt động để giải phóng đối tượng không còn được tham chiếu

- Thi hành phương thức finalize() để hủy đối tượng

 Ngoài ra, trong cơ chế hủy bỏ của C# còn có phương thức Dispose là một phương thức đối lập hoàn toàn so với phương thức Finalize() của đối tượng GC.

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. Khi đó ta không được phép dùng phương thức Finalize() trong đối tượng mà thay vào đó ta sẽ gọi một phương thức tĩnh của lớp GC (garbage collector) là GC.SuppressFinalize( this). Sau đó phương thức Finalize() sử dụng để gọi phương thức Dispose() như sau:  

public void Dispose()
{
// Thực hiện công việc dọn dẹp
// Yêu cầu bộ thu dọc GC trong thực hiện kết thúc
GC.SuppressFinalize( this );
}
public override void Finalize()
{
Dispose();
base.Finalize();
}

Câu lệnh using:

Mặc dù phương thức rọn rác của C# là tự động cung cấp nhưng không thể chác rằng phương thức Dispose() sẽ được gọi và việc giải phóng tài nguyên không thể xác định được. Câu lệnh using sẽ đảm bảo rằng phương thức Dispose() sẽ được gọi trong thời gian sớm nhất. Sử dụng using bằng cách gọi câu lệnh using và truyền vào tên đối tượng muốn hủy bỏ:  

using (tên đối tượng cần hủy bỏ)

Khi trong lớp không khai báo một destructor nào thì trình biên dịch sẽ gọi tiến trình Garbage collector trong ngôn ngữ C# để giải phóng đối tượng này trong bộ nhớ. Phần lớn trong ngôn ngữ C# thì có cơ chế tự động gom rác mỗi khi biến đó không được tham chiếu đến nên chúng ta không cần quan tâm nhiều đến nó như trong C++.

2.  Sử dụng các thành viên tĩnh static:

Thành viên tĩnh không thể hiện gì cho lớp về cả thuộc tính và phương thức mà nó như là một thành phần của lớp.

Sử dụng từ khóa static để khai báo một thành viên tĩnh. Thành phần tĩnh chỉ  được sử dụng với lớp, phương thức, thuộc tính, sự kiện và constructor nhưng không thể được sử dụng với những bản dãy, indexer, destructor hay kiểu khác với những lớp.  

Sử dụng phương thức tĩnh:

Một phương thức static có phạm vi hoạt động giống như một phương thức toàn cục mà không cần tạo ra bất cứ một thể hiện nào của lớp cả. Toàn cục ở đây hiểu theo nghĩa là toàn cục trong lớp. 

Gọi một phương thức static:

Về bản chất thành phần static là một thành phần của lớp không thể hiện trả về vì vậy không có một tham chiếu this. Một hàm static không thể trực tiếp truy xuất đến các thành viên không static mà phải thông qua một đối tượng thể hiện của lớp đó như sau:

Tenlop.tenhamtinh ([danh sach tham so neu co]:

Ví dụ diem.hien() là lời gọi đến phương thúc tĩnh có tên là hien() của lớp diem 

Sử dụng các phương thức khởi tạo static:

Trong khai báo một static constructor không có từ khóa truy cập. Phương thức tĩnh chỉ có thể truy nhập đến thành phần dữ liệu cũng có tính chất tĩnh mà thôi. Nếu trong khai báo lớp có một hàm static constructor thì hàm này sẽ được gọi trước khi bất cứ một thể hiện nào của lớp được tạo ra.

Việc sử dụng hàm khởi tạo static cần được cân nhắc kỹ lưỡng vì chúng ta không thể theo dõi nó được như trong C++ vì thế thường gây ra những hậu quả khó lường.

- Khởi tạo private constructor:

Việc sử dụng một hàm khởi tạo private trong lớp sẽ có tác dụng ngăn chặn  tạo ra bất kì một đối tượng nào của lớp. Hàm khởi tạo private này mặc nhiên, không có tham số gì cả và trống rỗng. Khi đó trong lớp sẽ không có hàm khởi tạo public nên sẽ không khởi tạo được bất cứ một thành viên thể hiện nào.

Ví dụ không muốn tạo ra bất kì một đối tượng nào của lớp diem thì trong khi định nghĩa lớp ta sẽ định nghĩa thêm một hàm khởi tạo tầm vực là private như sau:

private diem ()

{

 // không làm gì cả

} 

Sử dụng các thuộc tính tĩnh:

Trong C# không hề có một biến nào có phạm vi hoạt động toàn cục như trong một số ngôn ngữ lập trình khác ( pascal, C, C++, Visual Basic …) việc sử dụng một biến với mục đích “toàn cục” trở nên là một điều không thể. Biến toàn cục trong các ngôn ngữ khác được hiểu là toàn cục trong ứng dụng nhưng đối với C# thì toàn cục theo nghĩa hiểu của nó là toàn cục trong một lớp và không có khái niệm toàn cục trong toàn bộ chương trình. Nếu ta khai báo một biến thành viên tĩnh của lớp thì biến thành viên tĩnh này có tầm vực hoạt động theo ý nghĩa toàn cục đó. Các biến thành viên tĩnh có hoạt động tích cực trong vai trò này. 

Lớp tĩnh:

Một lớp có thể được xây dựng là một lớp tĩnh và chỉ chứa các thành phần tĩnh mà thôi và nó không cho phép tạo thể hiện của lớp bằng việc sử dụng từ khóa new. Lớp static thường được tải tự động trong Net.Framework khi chương trình hoặc namespace chứa lớp được tải lên.Việc tạo một static class giống với việc tạo ra một lớp mà chỉ chứa một private constructor. Như vậy là có thể kiểm tra chắc chắn và đảm bảo những thành viên của lớp này không thể được tạo ra. 

Khi nào thì sử dụng các thuộc tính tĩnh và khi nào thì sử dụng phương thức tĩnh:

+ Sử dụng phương thức tĩnh khi muốn khởi tạo một giá trị nào đó ngay khi chương trình biên dịch mà không cần tạo thể hiện của lớp hay việc tạo một thiết lập duy nhất mà một sự chuẩn bị (initializer) không thể thực hiện được và chỉ cần thực hiện một lần mà thôi. Trong trường hợp nếu ta muốn lớp mà sau khi ta định nghĩa không thể tao ra một thể hiện nào của nó thì ta sử dụng phương thức khởi tạo private (bên trong thân phương thức trống rỗng).

+ Sử dụng biến static khi bạn muốn tạo ra một biến có vai trò toàn cục trong lớp để theo dõi hoạt động của nó. Ví dụ như bạn tạo ra một biến static để theo dõi xem ở thời điểm hiện tại có bao nhiêu biến đối tượng được tạo ra chẳng hạn. Khi đó đi cùng với việc tạo đối tượng bạn hãy gọi phương thức chứa thành phần tĩnh này thì bạn có thể theo dõi như dùng biến toàn cục trong các ngôn ngữ lập trình khác.

+ Sử dụng lớp tĩnh để chứa các phương thức mà không liên quan tới một đối tượng đặc biệt. Chẳng hạn như yêu cầu tạo tập hợp phương thức không hành động theo thể hiện dữ liệu và không liên quan đến một đối tượng đặc biệt nào. Một static class không cho phép thừa kế.

3.  Nạp chồng phương thức

Chồng phương thức là việc tạo ra nhiều phương thức trùng tên với nhau nhưng nhận các tham số khác nhau hay trả về dữ liệu khác nhau. Việc phân biệt các hàm này dựa vào dấu ấn:

+ Khác nhau các tham số: khác nhau về số lượng tham số

+ Khác nhau về kiểu dữ liệu của tham số, kiểu dữ liệu trả về của phương thức.

Khi nạp chồng một phương thức ta phải thay đổi kí hiệu (dấu ấn) của phương thức, số tham số hay kiểu dữ liệu của tham  số hoặc có thể thay đổi cả về giá trị của các tham số. Khi đó thì thực chất không phải là nạp chồng phương thức mà đó là hai phương thức khác nhau có cùng tên nhưng khác nhau về kiểu giá trị trả về. Đó là một điều cần chú ý khi nạp chồng phương thức.

Khi gọi một phương thức có nạp chồng phương thức thì cần chú ý về số tham số, kiểu dữ liệu cho phù hợp với từng phương thức nếu không thì sẽ phát sinh lỗi khi biên dịch chương trình.

4.  Đóng gói dữ liệu thông qua các thuộc tính:

Đóng gói dữ liệu với thuộc tính thực chất là một quá trình ta lấy giá trị cho biến thành viên và thiết lập giá trị đó cho biến để nó được truy cập 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 getset



         + Phương thức get trả về một đối tượng dữ liệu kiểu thuộc tính, phương thức này giống phương thức của đối tượng.

         + Phương thức set: thiết lập giá trị của thuộc tính, có kiểu trả về là void. Khi thiết lập một phương thức set phải dùng từ khóa value để tượng trưng cho đối được trao và được giữ bởi thuộc tính.

Lợi ích của việc gói ghém dữ liệu là che giấu thông tin mặc dù người sử dụng vẫn thao tác với thuộc tính. 

Vài điểm cần chú ý khi định nghĩa một thuộc tính

 

public string  (tên thuộc tính)
		{
		       get { //Lấy giá tri thuộc tính }
		       set { //Trả về giá trị cùng kiểu với thuộc tính đã khai báo}
		}

 

         + Ta không khai báo tường minh các tham số trong thủ tục set..

         + Có thể chỉ xây dựng thuộc tính chỉ đọc hoặc chỉ viêt bằng cách bỏ đi một trong hai thủ tục trên.

         + Nếu ta muốn tạo một thuộc tính có public để đọc nhưng lại muốn hạn chế protected trong gán thì phải tạo thuộc tính chỉ đọc public sau đó tạo một hàm set() với truy cập protected ở bên ngoài thuộc tính đó.

         + C# cho phép bạn tạo một thuộc tính virtual hay abstract ( xem thêm kế thừa và đa hình) cú pháp như sau:

                  public abstract string (tên thuộc tính)

                            {

                                      get;

                                      set;

                            }

stty
 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
ca do bong da online
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.