Tìm hiểu C# và ứng dụng của C# p 5

Chia sẻ: Yukogaru | Ngày: | Loại File: PDF | Số trang:7

0
72
lượt xem
25
download

Tìm hiểu C# và ứng dụng của C# p 5

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Chương 4 Lớp và đối tượng Đối tượng là một trị có thể được tạo ra, lưu giữ và sử dụng. Trong C# tất cả các biến đều là đối tượng. Các biến kiểu số, kiểu chuỗi … đều là đối tượng. Mỗi một đối tượng đều có các biến thành viên để lưu giữ dữ liệu và có các phương thức (hàm) để tác động lên biến thành viên. Mỗi đối tượng thuộc về một lớp đối tương nào đó. Các đối tượng có cùng lớp thì có cùng các biến thành viên và phương thức. 4.1 Định nghĩa lớp Định nghĩa...

Chủ đề:
Lưu

Nội dung Text: Tìm hiểu C# và ứng dụng của C# p 5

  1. Lớp và đối tượng Gvhd: Nguyễn Tấn Trần Minh Khang Chương 4 Lớp và đối tượng Đối tượng là một trị có thể được tạo ra, lưu giữ và sử dụng. Trong C# tất cả các biến đều là đối tượng. Các biến kiểu số, kiểu chuỗi … đều là đối tượng. Mỗi một đối tượng đều có các biến thành viên để lưu giữ dữ liệu và có các phương thức (hàm) để tác động lên biến thành viên. Mỗi đối tượng thuộc về một lớp đối tương nào đó. Các đối tượng có cùng lớp thì có cùng các biến thành viên và phương thức. 4.1 Định nghĩa lớp Định nghĩa một lớp mới với cú pháp như sau: [attribute][bổ từ truy xuất] class định danh [:lớp cơ sở] { thân lớp } Ví dụ 4-1 Khai báo một lớp public class Tester { public static int Main( ) { ... } } Khi khai báo một lớp ta định nghĩa các đặc tính chung của tất cả các đối tượng của lớp và các hành vi của chúng. Ví dụ 4-2 Khai báo, tạo và sử dựng một lớp using System; public class Time { // phương thức public public void DisplayCurrentTime( ) { Console.WriteLine( "stub for DisplayCurrentTime" ); } // các biến private int Year; int Month; int Date; int Hour; int Minute; int Second; } public class Tester { static void Main( ) { Time t = new Time( ); t.DisplayCurrentTime( ); } 24
  2. Lớp và đối tượng Gvhd: Nguyễn Tấn Trần Minh Khang } 4.1.1 Bổ từ truy xuất Bổ từ truy xuất xác định thành viên (nói tắt của biến thành viên và phương thức thành viên) nào của lớp được truy xuất từ lớp khác. Có các loại kiểu truy xuất sau: Bảng 4-1 Các bổ từ truy xuất Từ khóa Giải thích public Truy xuất mọi nơi protected Truy xuất trong nội bộ lớp hoặc trong các lớp con internal Truy xuất nội trong chương trình (assembly) protected internal Truy xuất nội trong chương trình (assembly) và trong các lớp con private (mặc định) Chỉ được truy xuất trong nội bộ lớp 4.1.2 Các tham số của phương thức Mỗi phương thức có thể không có tham số mà cũng có thể có nhiều tham số. Các tham số theo sau tên phương thức và đặt trong cặp ngoặc đơn. Ví dụ như phương thức SomeMethod sau: Ví dụ 4-3 Các tham số và cách dùng chúng trong phương thức using System; public class MyClass { public void SomeMethod(int firstParam, float secondParam) { Console.WriteLine("Here are the parameters received: {0}, {1}", firstParam, secondParam); } } public class Tester { static void Main( ) { int howManyPeople = 5; float pi = 3.14f; MyClass mc = new MyClass( ); mc.SomeMethod(howManyPeople, pi); } } 4.2 Tạo đối tượng Tạo một đối tượng bẳng cách khai báo kiểu và sau đó dùng từ khoá new để tạo như trong Java và C++. 25
  3. Lớp và đối tượng Gvhd: Nguyễn Tấn Trần Minh Khang 4.2.1 Hàm dựng - Constructor Hàm dựng là phương thức đầu tiên được triệu gọi và chỉ gọi một lần khi khởi tạo đối tượng, nó nhằm thiết lập các tham số đầu tiên cho đối tượng. Tên hàm dựng trùng tên lớp; còn các mặt khác như phương thức bình thường. Nếu lớp không định nghĩa hàm dựng, trình biên dịch tự động tạo một hàm dựng mặc định. Khi đó các biến thành viên sẽ được khởi tạo theo các giá trị mặc định: Bảng 4-2 Kiểu cơ sở và giá trị mặc định Kiểu Giá trị mặc định số (int, long, …) 0 bool false char ‘\0’ (null) enum 0 Tham chiếu null Ví dụ 4-4 Cách tạo hàm dựng public class Time { // public accessor methods public void DisplayCurrentTime( ) { System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}", Month, Date, Year, Hour, Minute, Second); } // constructor public Time(System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; } // private member variables 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( ); 26
  4. Lớp và đối tượng Gvhd: Nguyễn Tấn Trần Minh Khang } } Kết quả: 11/16/2000 16:21:40 4.2.2 Khởi tạo Ta có thể khởi tạo giá tri các biến thành viên theo ý muốn bằng cách khởi tạo nó trong constructor của lớp hay có thể gán vào trực tiếp lúc khai báo. Với giá trị khởi tạo này thì khi một đối tượng khai báo kiểu của lớp này thì giá trị ban đầu là các giá trị khởi tạo chứ không phải là giá trị mặc định. 4.2.3 Hàm dựng sao chép Hàm dựng sao chép (copy constructor) là sao chép toàn bộ nội dung các biến từ đối tượng đã tồn tại sang đối tượng mới khởi tạo. Ví dụ 4-5 Một hàm dựng sao chép public Time(Time existingTimeObject) { Year = existingTimeObject.Year; Month = existingTimeObject.Month; Date = existingTimeObject.Date; Hour = existingTimeObject.Hour; Minute = existingTimeObject.Minute; Second = existingTimeObject.Second; } 4.2.4 Từ khoá this Từ khoá this được dùng để tham chiếu đến chính bản thân của đối tượng đó. Ví dụ: public void SomeMethod (int hour) { this.hour = hour; } 4.3 Sử dụng các thành viên tĩnh Các đặc tính và phương thức của một lớp có thể là thành viên thể hiện (instance member) hay thành viên tĩnh. Thành viên thể hiện thì kết hợp với thể hiện của một kiểu, trong khi các thành viên của static nó lại là một phần của lớp. Ta có thể truy cập các thành viên static thông qua tên của lớp mà không cần tạo một thể hiện lớp. 4.3.1 Cách gọi một thành viên tĩnh Phương thức tĩnh (static) được nói là hoạt động trong lớp. Do đó, nó không thể được tham chiếu this chỉ tới. Phương thức static cũng không truy cập trực tiếp vào các phương thức không static được mà phải dùng qua thể hiện của đối tượng. Ví dụ 4-6 Cách sử dụng phương thức tĩnh using System; 27
  5. Lớp và đối tượng Gvhd: Nguyễn Tấn Trần Minh Khang public class MyClass { public void SomeMethod(int firstParam, float secondParam) { Console.WriteLine( "Here are the parameters received: {0}, {1}", firstParam, secondParam); } } public class Tester { static void Main( ) { int howManyPeople = 5; float pi = 3.14f; MyClass mc = new MyClass( ); mc.SomeMethod(howManyPeople, pi); } } Trong ví dụ trên phương thức Main() là tĩnh và phương thức SomeMethod() không là tĩnh. 4.3.2 Sử dụng hàm dựng tĩnh Hàm dựng tĩnh (static constructor) sẽ được chạy trước khi bất kỳ đối tượng nào tạo ra.Ví dụ: static Time( ) { Name = "Time"; } Khi dùng hàm dựng tĩnh phải khá thận trọng vì nó có thể có kết quả khó lường. 4.3.3 Hàm dựng private Khi muốn tạo một lớp mà không cho phép tạo bất kỷ một thể hiện nào của lớp thì ta dùng hàm dựng private. 4.3.4 Sử dụng các trường tĩnh Cách dùng chung các biến thành viên tĩnh là giữ vết của một số các thể hiện mà hiện tại nó đang tồn tại trong lớp đó. Ví dụ 4-7 Cách dùng trường tĩnh using System; public class Cat { public Cat( ) { instances++; } public static void HowManyCats( ) { 28
  6. Lớp và đối tượng Gvhd: Nguyễn Tấn Trần Minh Khang Console.WriteLine("{0} cats adopted", instances); } private static int instances = 0; } public class Tester { static void Main( ) { Cat.HowManyCats( ); Cat frisky = new Cat( ); Cat.HowManyCats( ); Cat whiskers = new Cat( ); Cat.HowManyCats( ); } } Kết quả: 0 cats adopted 1 cats adopted 2 cats adopted Ta có thể thấy được rằng phương thức static có thể truy cập vào biến static. 4.4 Hủy đối tượng Giống với Java, C# cũng cung cấp bộ thu dọn rác tự động nó sẽ ngầm hủy các biến khi không dùng. Tuy nhiên trong một số trường hợp ta cũng cần hủy tường minh, khi đó chỉ việc cài đặt phương thức Finalize(), phương thức này sẽ được gọi bởi bộ thu dọn rác. Ta không cần phải gọi phương thức này. 4.4.1 Hủy tử của C# Hủy tử của C# cũng giống như hủy tử trong C++. Khai báo một hủy tử theo cú pháp: ~() {} trong đó, định danh của hủy tử trùng với dịnh danh của lớp. Để hủy tường minh ta gọi phương thức Finalize() của lớp cơ sở trong nội dung của hủy tử này. 4.4.2 Finalize hay Dispose Finalize không được pháp gọi tường minh; tuy nhiên trong trường hợp ta đang giữ môt tài nguyên hệ thống và hàm gọi có khả năng giải phóng tài nguyên này, ta sẽ cài đặt giao diện IDisposable (chí có một phương thức Dispose). Giao diện sẽ được đề cậpp ở chương sau. 4.4.3 Câu lệnh using Bởi vì ta không thể chắc rằng Dispose() sẽ được gọi và vì việc giải phóng tài nguyên không thể xác định được, C# cung cấp cho ta lệnh using để đảm bảo rằng Dispose() sẽ được gọi trong thời gian sớm nhất. Ví dụ sau minh hoạ vấn đề này: 29
  7. Lớp và đối tượng Gvhd: Nguyễn Tấn Trần Minh Khang Console.WriteLine("{0} cats adopted", instances); } private static int instances = 0; } public class Tester { static void Main( ) { Cat.HowManyCats( ); Cat frisky = new Cat( ); Cat.HowManyCats( ); Cat whiskers = new Cat( ); Cat.HowManyCats( ); } } Kết quả: 0 cats adopted 1 cats adopted 2 cats adopted Ta có thể thấy được rằng phương thức static có thể truy cập vào biến static. 29
Đồng bộ tài khoản