Hướng Đối Tượng Trong C# part 5
Số trang: 11
Loại file: pdf
Dung lượng: 154.61 KB
Lượt xem: 14
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Construction and Disposal Constructor : Cú pháp khai báo một Constructor là : chúng ta khai báo một phương thức mà cùng tên với lớp và không có kiểu trả về. public class MyClass { public MyClass() { } // rest of class definition
Nội dung trích xuất từ tài liệu:
Hướng Đối Tượng Trong C# part 5Construction and DisposalConstructor :Cú pháp khai báo một Constructor là : chúng ta khai báo một phương thức mà cùng tênvới lớp và không có kiểu trả về.public class MyClass{ public MyClass() { } // rest of class definitionNhư trong c++ và java, bạn có thể không cần định nghĩa constructor trong lớp của bạnnếu không cần thiết. Nếu bạn không định nghĩa một constructor nào trong lớp của bạn thìtrình biên dịch tạo một constructor mặc định để khởi tạo một số giá trị mặc định như: gánchuỗi rỗng cho chuỗi, gán 0 cho kiểu số, false cho kiểu bool.Các contructor theo cùng luật overloading như các phương thức khác. Bạn cũng có thểtạo nhiều constructor cùng tên và khác tham số giống như các phương thức nạp chồng : public MyClass() // zero-parameter constructor { // construction code } public MyClass(int number) // another overload { // construction code }Chú ý : khi bạn đã định nghĩa một constructor trong lớp của bạn thì trình biên dịch sẽkhông tự động tạo ra constructor mặc định.Chúng ta có thể định nghĩa các constructor với các bổ từ private và protected để chúngkhông thể được nhìn thấy trong các lớp không có quan hệ:public class MyNumber{ private int number; private MyNumber(int number) // another overload { this.number = number; }}Chú ý: Nếu bạn định nghĩa một hay nhiều constructor private thì những lớp thừa kế lớpcủa bạn sẽ không thể khởi tạo được. Do đó chúng ta phải cân nhắc kỹ lưỡng khi địnhnghĩa bổ từ của một constructor.Constructor tĩnh(static):Chúng ta định nghĩa một constructor tĩnh để khởi tạo giá trị cho các biến tĩnh.class MyClass{ static MyClass() { // initialization code } // rest of class definition}Một nguyên nhân để viết một constructor tĩnh là: Nếu lớp của bạn có một số trường haythuộc tính cần được khởi tạo từ bên ngoài trước khi lớp được sử dụng lần đầu tiên.Chúng ta không thể biết chắc được khi nào một constructor tĩnh sẽ được thực hiện. Vàchúng ta cũng không biết trước các constructor tĩnh của các lớp khác nhau sẽ thực hiệnnhững gì. Nhưng chúng ta có thể chắc chắn rằng constructor tĩnh chỉ chạy một lần và nósẽ được gọi trước khi đoạn mã của bạn tham khảo đến lớp đó. Trong C#, Constructor tĩnhthường được thực hiện ngay trước lần gọi đầu tiên của một thành viên trong lớp đó.Constructor tĩnh không có bổ từ truy cập, không có bất kỳ một tham số nào và chỉ có duynhất một constructor tĩnh trong một lớp.Chúng ta có thể định nghĩa một constructor tĩnh và một constructor thực thể không cótham số trong cùng một lớp. Nó không gây ra bất kỳ một sự xung đột nào bởi vìconstructor tĩnh được thực hiện khi lớp được khởi tạo còn constructor thực thể được thựchiện khi một thực thể được tạo ra.Gọi các constructor từ những constructor khác:Xét ví dụ như sau:class Car{ private string description; private uint nWheels; public Car(string model, uint nWheels) { this.description = description; this.nWheels = nWheels; } public Car(string model) { this.description = description; this.nWheels = 4; }// etc.Ta thấy cả hai constructor đều khởi tạo cùng các trường, và nó sẽ ngắn gọn hơn nếu ta chỉcần viết đoạn mã ở một constructor. C# cho phép ta làm đều đó như sau:class Car{ private string description; private uint nWheels; public Car(string model, uint nWheels) { this.description = description; this.nWheels = nWheels; } public Car(string model) : this(model, 4) { } // etcKhi ta khởi tạo một biến như sau:Car myCar = new Car(Proton Persona);Thì constructor 2 tham số sẽ được thực thi trước bất kỳ đoạn mã nào trong constructor 1biến.Constructor của các lớp thừa hưởng:Khi chúng ta tạo ra một thể hiện của một lớp thừa hưởng thì không phải chỉ nhữngconstructor của lớp thừa hưởng đó được thực hiện mà cả những constructor của lớp cơ sởcũng được gọi. Và các constructor của lớp cơ sở sẽ được thực hiện trước khi cácconstructor của lớp thừa hưởng.Chúng ta xét ví dụ sau:abstract class GenericCustomer{ private string name; // lots of other methods etc.}class Nevermore60Customer : GenericCustomer{ private uint highCostMinutesUsed; // other methods etc.}Đều chúng ta cần ở ví dụ trên là khi một thể hiện của lớp Nevermore60Customer đượctạo ra thì thuộc tính name phải được khởi tạo giá trị null và thuộc tínhhighCostMinutesUsed được khởi tạo là 0.GenericCustomer arabel = new Nevermore60Customer();Đối với thuộc tính highCostMinutesUsed thì không có vấn đề gì, nó sẽ được constructormặc định khởi tạo giá trị 0. Còn thuộc tính name thì sao? Lớp con không thể truy cập vàothuộc tính này bởi vì nó được khai báo private. Nhưng trên thực tế thì thuộc tính này luônđược khởi tạo giá trị null vì khi này constructor của lớp cơ sở cũng được gọi và nó thựchiện trước khởi tạo giá trị null cho thuộc tính name.Thêm một constructor không tham số trong một quan hệ thừa kế:Chúng ta sẽ xem xét chuyện gì sẽ xảy ra nếu ta thay thế constructor mặc định bằng mộtconstructor khác không có tham số. Xét ví dụ ở trên, bây giờ ta muốn khởi tạo name bằnggiá trị ta làm như sau:public abstract class GenericCustomer { private string name; public GenericCustomer() : base() // chúng ta có thể xoá bỏ dòng này mà không có ảnh hưởng gì khi biên dịch { name = ; }Điểm chú ý ở đây là chúng ta thêm lời gọi tường minh đến constructor của lớp cơ sởtrước khi constructor của lớp GenericCustomer được thực hiện và chúng ta sử dụng từkhoá base để gọi các constructor ở lớp cơ sở.Trên thực tế chúng ta có thể viết như sau: public GenericCustomer() { name = ; }Nếu trình biên dịch không thấy bất kỳ một sự tham khảo nào đến các constructor khác thìnó sẽ nghĩ là chúng ta muốn gọi constructor mặc định của lớp cơ sở.Chú ý: Từ khoá base và this chỉ cho phép dùng để gọi một constructor khác, nếu khôngnó sẽ báo lỗi.Nếu chúng ta k ...
Nội dung trích xuất từ tài liệu:
Hướng Đối Tượng Trong C# part 5Construction and DisposalConstructor :Cú pháp khai báo một Constructor là : chúng ta khai báo một phương thức mà cùng tênvới lớp và không có kiểu trả về.public class MyClass{ public MyClass() { } // rest of class definitionNhư trong c++ và java, bạn có thể không cần định nghĩa constructor trong lớp của bạnnếu không cần thiết. Nếu bạn không định nghĩa một constructor nào trong lớp của bạn thìtrình biên dịch tạo một constructor mặc định để khởi tạo một số giá trị mặc định như: gánchuỗi rỗng cho chuỗi, gán 0 cho kiểu số, false cho kiểu bool.Các contructor theo cùng luật overloading như các phương thức khác. Bạn cũng có thểtạo nhiều constructor cùng tên và khác tham số giống như các phương thức nạp chồng : public MyClass() // zero-parameter constructor { // construction code } public MyClass(int number) // another overload { // construction code }Chú ý : khi bạn đã định nghĩa một constructor trong lớp của bạn thì trình biên dịch sẽkhông tự động tạo ra constructor mặc định.Chúng ta có thể định nghĩa các constructor với các bổ từ private và protected để chúngkhông thể được nhìn thấy trong các lớp không có quan hệ:public class MyNumber{ private int number; private MyNumber(int number) // another overload { this.number = number; }}Chú ý: Nếu bạn định nghĩa một hay nhiều constructor private thì những lớp thừa kế lớpcủa bạn sẽ không thể khởi tạo được. Do đó chúng ta phải cân nhắc kỹ lưỡng khi địnhnghĩa bổ từ của một constructor.Constructor tĩnh(static):Chúng ta định nghĩa một constructor tĩnh để khởi tạo giá trị cho các biến tĩnh.class MyClass{ static MyClass() { // initialization code } // rest of class definition}Một nguyên nhân để viết một constructor tĩnh là: Nếu lớp của bạn có một số trường haythuộc tính cần được khởi tạo từ bên ngoài trước khi lớp được sử dụng lần đầu tiên.Chúng ta không thể biết chắc được khi nào một constructor tĩnh sẽ được thực hiện. Vàchúng ta cũng không biết trước các constructor tĩnh của các lớp khác nhau sẽ thực hiệnnhững gì. Nhưng chúng ta có thể chắc chắn rằng constructor tĩnh chỉ chạy một lần và nósẽ được gọi trước khi đoạn mã của bạn tham khảo đến lớp đó. Trong C#, Constructor tĩnhthường được thực hiện ngay trước lần gọi đầu tiên của một thành viên trong lớp đó.Constructor tĩnh không có bổ từ truy cập, không có bất kỳ một tham số nào và chỉ có duynhất một constructor tĩnh trong một lớp.Chúng ta có thể định nghĩa một constructor tĩnh và một constructor thực thể không cótham số trong cùng một lớp. Nó không gây ra bất kỳ một sự xung đột nào bởi vìconstructor tĩnh được thực hiện khi lớp được khởi tạo còn constructor thực thể được thựchiện khi một thực thể được tạo ra.Gọi các constructor từ những constructor khác:Xét ví dụ như sau:class Car{ private string description; private uint nWheels; public Car(string model, uint nWheels) { this.description = description; this.nWheels = nWheels; } public Car(string model) { this.description = description; this.nWheels = 4; }// etc.Ta thấy cả hai constructor đều khởi tạo cùng các trường, và nó sẽ ngắn gọn hơn nếu ta chỉcần viết đoạn mã ở một constructor. C# cho phép ta làm đều đó như sau:class Car{ private string description; private uint nWheels; public Car(string model, uint nWheels) { this.description = description; this.nWheels = nWheels; } public Car(string model) : this(model, 4) { } // etcKhi ta khởi tạo một biến như sau:Car myCar = new Car(Proton Persona);Thì constructor 2 tham số sẽ được thực thi trước bất kỳ đoạn mã nào trong constructor 1biến.Constructor của các lớp thừa hưởng:Khi chúng ta tạo ra một thể hiện của một lớp thừa hưởng thì không phải chỉ nhữngconstructor của lớp thừa hưởng đó được thực hiện mà cả những constructor của lớp cơ sởcũng được gọi. Và các constructor của lớp cơ sở sẽ được thực hiện trước khi cácconstructor của lớp thừa hưởng.Chúng ta xét ví dụ sau:abstract class GenericCustomer{ private string name; // lots of other methods etc.}class Nevermore60Customer : GenericCustomer{ private uint highCostMinutesUsed; // other methods etc.}Đều chúng ta cần ở ví dụ trên là khi một thể hiện của lớp Nevermore60Customer đượctạo ra thì thuộc tính name phải được khởi tạo giá trị null và thuộc tínhhighCostMinutesUsed được khởi tạo là 0.GenericCustomer arabel = new Nevermore60Customer();Đối với thuộc tính highCostMinutesUsed thì không có vấn đề gì, nó sẽ được constructormặc định khởi tạo giá trị 0. Còn thuộc tính name thì sao? Lớp con không thể truy cập vàothuộc tính này bởi vì nó được khai báo private. Nhưng trên thực tế thì thuộc tính này luônđược khởi tạo giá trị null vì khi này constructor của lớp cơ sở cũng được gọi và nó thựchiện trước khởi tạo giá trị null cho thuộc tính name.Thêm một constructor không tham số trong một quan hệ thừa kế:Chúng ta sẽ xem xét chuyện gì sẽ xảy ra nếu ta thay thế constructor mặc định bằng mộtconstructor khác không có tham số. Xét ví dụ ở trên, bây giờ ta muốn khởi tạo name bằnggiá trị ta làm như sau:public abstract class GenericCustomer { private string name; public GenericCustomer() : base() // chúng ta có thể xoá bỏ dòng này mà không có ảnh hưởng gì khi biên dịch { name = ; }Điểm chú ý ở đây là chúng ta thêm lời gọi tường minh đến constructor của lớp cơ sởtrước khi constructor của lớp GenericCustomer được thực hiện và chúng ta sử dụng từkhoá base để gọi các constructor ở lớp cơ sở.Trên thực tế chúng ta có thể viết như sau: public GenericCustomer() { name = ; }Nếu trình biên dịch không thấy bất kỳ một sự tham khảo nào đến các constructor khác thìnó sẽ nghĩ là chúng ta muốn gọi constructor mặc định của lớp cơ sở.Chú ý: Từ khoá base và this chỉ cho phép dùng để gọi một constructor khác, nếu khôngnó sẽ báo lỗi.Nếu chúng ta k ...
Tìm kiếm theo từ khóa liên quan:
máy tính mạng máy tính internet C# ngôn ngữ C# ngôn ngữ ngôn ngữ lập trình lập trình phần mềm file ứng dụngGợi ý tài liệu liên quan:
-
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 272 0 0 -
Giáo án Tin học lớp 9 (Trọn bộ cả năm)
149 trang 263 0 0 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 263 0 0 -
Bài thuyết trình Ngôn ngữ lập trình: Hệ điều hành Window Mobile
30 trang 263 0 0 -
Ngân hàng câu hỏi trắc nghiệm môn mạng máy tính
99 trang 251 1 0 -
Giáo trình Hệ thống mạng máy tính CCNA (Tập 4): Phần 2
102 trang 244 0 0 -
Bài giảng: Lịch sử phát triển hệ thống mạng
118 trang 244 0 0 -
47 trang 237 3 0
-
Đề cương chi tiết học phần Thiết kế và cài đặt mạng
3 trang 234 0 0 -
Giáo trình Lập trình cơ bản với C++: Phần 1
77 trang 232 0 0