Kĩ thuật lập trình - Chương 3: Lớp và đối tượng
Định nghĩa lớp Tạo đối tượng Sử dụng các thành viên tĩnh Truyền tham số Hàm dựng và nạp chồng phương thức Đóng gói dữ liệu với property
Bạn đang xem trước 20 trang tài liệu Kĩ thuật lập trình - Chương 3: Lớp và đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 3: Lớp và đối tượngNội dung chínhĐịnh nghĩa lớp Tạo đối tượngSử dụng các thành viên tĩnh Truyền tham số Hàm dựng và nạp chồng phương thức Đóng gói dữ liệu với property 1. Định nghĩa lớpLớp trong C# cho phép người lập trình tự định nghĩa các kiểu dữ liệu phức tạp (user-defined types) và được sử dụng tương tự như kiểu dữ liệu có sẵn (built-in data types).Lớp thường được sử dụng để định nghĩa các vấn đề trừu tượng như: ngày tháng, vector Lớp cho phép tách rời phần cài đặt (implementation) và phần giao diện (interface).1.Định nghĩa lớp (tt)Một lớp có chứa dữ liệu (member data) và hàm (member function).Classdata1data2data3functiona()functionb()functionc()Ví dụclass Employee // khai báo tên lớp{ // từ khóa cho biết không thể truy nhập từ ngoài lớp private int EmpID ; // member data private char EmpName[30]; private float EmpSalary; // từ khóa cho biết có thể truy nhập từ ngoài lớp public void AddEmployee(); // member function}; Bổ từ truy xuấtTừ khoáGiải thíchpublicTruy xuất mọi nơiprotectedTruy xuất trong nội bộ lớp hoặc trong các lớp conprivate (mặc định)Chỉ được truy xuất trong nội bộ lớpVí dụusing System;public class Time{ // phương thức public public void DisplayCurrentTime() { Console.WriteLine("stub for DisplayCurrentTime"); } // các biến private private int Year; int Month; int Date; public int Hour,Minute, Second;}public class Tester{ static void Main() { Time t = new Time(); t.DisplayCurrentTime(); }}Điều khiển truy nhậpClassprivate public data1data2functiond()functiona()functionb()functionc()Phần được khai báo với từ khóa private chỉ được truy nhập bởi các hàm thành phần của cùng classPhần được khai báo với từ khóa public có thể được truy nhập tạibất kỳ nơi nào trong chương trình2.Tạo đối tượngCú pháp khai báo đối tượng và cấp phát vùng nhớ cho đối tượng:TênLớp TênBiếnĐốiTượng;TênBiếnĐốiTượng = new TênLớp(DanhSáchĐốiSố);hoặcTênLớp TênBiếnĐốiTượng = new TênLớp(DanhSáchĐốiSố);Chú ý:• Sau khi khai báo biến đối tượng thì biến đó chỉ là một con trỏ.• Sau khi cấp phát bắng từ khóa new thì biến trỏ tới một đối tượng thực sự.public void Xuat(){Console.WriteLine("Hinh chu nhat: Dai = {0},Rong = {1}", Dai, Rong);}}class Application{static void Main(string[] args){HCN h;h = new HCN();h.Nhap();h.Xuat();Console.WriteLine("Chu vi hinh chu nhat:{0}", h.ChuVi());Console.WriteLine("Dien tich hinh chu nhat:{0}", h.DienTich());Console.ReadLine();}}}2.Tạo đối tượngVí dụ:Chương trình nhập chiều dài, chiều rộng của hình chữ nhật và xuất ra diện tích, chu vi của hình chữ nhật.using System;namespace LopDoiTuongHCN{class HCN{protected float Dai, Rong;public float ChuVi(){return (Dai + Rong )*2;}public float DienTich(){return Dai* Rong;}public void Nhap(){Console.WriteLine("Nhap chieu dai: ");Dai = float.Parse(Console.ReadLine());Console.WriteLine("Nhap chieu rong: ");Rong = float.Parse(Console.ReadLine());}Từ khoá thisTừ 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;}3.Sử dụng các thành viên tĩnhPhươ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.Việc truy cập đến thành viên tĩnh (static) phải thực hiện thông qua tên lớp (không được truy cập thành viên tĩnh thông qua đối tượng) theo cú pháp: TênLớp.TênThànhViênTĩnhVí dụVí dụ 4‑6 Cách sử dụng phương thức tĩnhusing 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); }}Trong ví dụ trên phương thức Main() là tĩnh và phương thức SomeMethod() không là tĩnh.3.Sử dụng các trường tĩnh (tt)public void HowManyCats1() { Console.WriteLine("{0} cats adopted", instances); } private static int instances = 0; public static int instances1 = 0;}using System;public class Cat{ public Cat() { instances++; } public static void HowManyCats() { Console.WriteLine("{0} cats adopted",instances); } 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 đó.public class Tester{ static void Main() { Cat c = new Cat(); //Truy cap vao phuong thuc ko Static phải tạo 1 đối tượng c.HowManyCats1(); //Khong the truy cap vao phuong thuc Static //bang this, hay the hien //đoi tuong ma Tendoituong.phuongthuc_static Cat.HowManyCats(); Cat frisky = new Cat(); Cat.HowManyCats(); Cat whiskers = new Cat(); Cat.HowManyCats(); }}3. Sử dụng các trường tĩnh (tt)4. Truyền tham sốTrong C#, ta có thể truyền tham số cho phương thức theo kiểu tham chiếu hoặc tham trịTruyền bằng tham chiếuMột hàm chỉ có thể trả về một giá trị. Trong trường hợp muốn nhận về nhiều kết quả, ta sử dụng chính các tham số truyền cho hàm như các tham số có đầu ra (chứa trị trả về). Ta gọi tham số truyền theo kiểu này là tham chiếu.Ví dụTrị trả về trong tham sốpublic class Time{// một phương thức publicpublic void DisplayCurrentTime(){System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}“, Month, Date, Year, Hour, Minute, Second);}public int GetHour( ){return Hour;}public void GetTime(ref int h, ref int m, ref int s){ h = Hour; m = Minute; s = Second;} Ví dụ (tt)// hàm dựng public Time(System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; } // biến thành viên private private int Year; private int Month; private int Date; private int Hour; private int Minute; private int Second;}Ví dụ (tt)public class Tester{ static void Main( ) { System.DateTime currentTime = System.DateTime.Now; Time t = new Time(currentTime); t.DisplayCurrentTime( ); int theHour = 0; int theMinute = 0; int theSecond = 0; t.GetTime(ref theHour, ref theMinute, ref theSecond); System.Console.WriteLine("Current time: {0}:{1}:{2}", theHour, theMinute, theSecond); }}Ví dụ: Đối tượng làm tham sốobject d2 soluongdongiathanhtienobject d1 soluongdongiathanhtiend2.add_solg(d1,65);dayd1.dayHàm thành phần của d2 truynhập trực tiếp tới dữ liệu soluong của nóHàm thành phần của d2 truynhập tới dữ liệu soluong của đối tượng d1Truyền tham số đầu ra (out parameter) Mặc định, C# quy định tất các biến phải được gán giá trị trước khi sử dụng, vì vậy,trong ví dụ trên, nếu chúng ta không khởi tạo các biến theHour, theMinute bằng giá trị 0 thì trình biên dịch sẽ thông báo lỗi. Từ khóa out cho phép ta sử dụng tham chiếu mà không cần phải khởi gán giá trị đầu. Trong ví dụ trên, ta có thể sửa phương thức GetTime thành:public void GetTime(out int h, out int m, out int s)5. Hàm tạo, hàm dựng và chồng phương thức (constructor)Hàm tạo là một hàm thành phần được tự động viện dẫn khi khởi tạo một đối tượng mới của lớp.Hàm tạo phải có tên trùng với tên lớp và không có giá trị trả về.Nếu không khai báo hàm tạo thì một hàm tạo mặc định sẽ tự động được tạo ra.Nếu đã khai báo hàm tạo thì không tự động có hàm tạo mặc địnhVí dụ: Hàm tạo mặc địnhpublic 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( ); }}Kết quả:11/16/2000 16:21:40Hàm tạo sao chépHàm tạo sao chép khởi tạo đối tượng dựa trên một đối tượng khác thuộc cùng lớp.Mỗi lớp có một hàm tạo sao chép mặc định – có một tham số là đối tượng của cùng một lớp.Ta có thể định nghĩa lại hàm tạo sao chép.Một hàm dựng sao chéppublic Time(Time existingTimeObject){ Year = existingTimeObject.Year; Month = existingTimeObject.Month; Date = existingTimeObject.Date; Hour = existingTimeObject.Hour; Minute = existingTimeObject.Minute; Second = existingTimeObject.Second;}Nạp chồng phương thứcTa muốn có nhiều phương thức cùng tên mà mỗi phương thức lại có các tham số khác nhau, số lượng tham số cũng có thể khác nhau. Như vậy, ý nghĩa của các phương thức được trong sáng hơn và các phương thức linh động hơn trong nhiều trường hợp. Nạp chồng cho phép ta làm được việc này.Ví dụNạp chồng hàm dựngpublic class Time{ // public accessor methods public void DisplayCurrentTime( ) { System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}", Month, Date, Year, Hour, Minute, Second); } // constructors public Time(System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; }public Time(int Year, int Month, int Date, int Hour, int Minute, int Second) { this.Year = Year; this.Month = Month; this.Date = Date; this.Hour = Hour; this.Minute = Minute; this.Second = Second; } // private member variables private int Year; private int Month; private int Date; private int Hour; private int Minute; private int Second;}public class Tester{static void Main( ){System.DateTime currentTime = System.DateTime.Now;Time t = new Time(currentTime);t.DisplayCurrentTime( );Time t2 = new Time(2000,11,18,11,03,30);t2.DisplayCurrentTime( );}}6. Đóng gói dữ liệu với property C# cung cấp khai báo hàm chung gọi là property cho hàm get và set.Ví dụ: Trong lớp DocGia có biến thành viên m_sHoTen, cài đặt Property cho biến thành viên này như sau:public string HoTen{ get { return m_sHoTen; } set { m_sHoTen = value; }}Lưu ý:Thứ nhất khai báo Property không có tham số và cặp ngoặc.Trong thân property dùng hai từ khóa get/set tương ứng cho hai hành động lấy/thiết đặt giá trị thuộc tính Phương thức get Thân của phương thức truy cập get cũng giống như các phương thức khác nhưng phương thức này trả về một đối tượng kiểu là một đặc tính của lớp. Ví dụ muốn lấy Hour như sau:get { return hour; }Phương thức set Phương thức set thiết lập giá trị một property của đối tượng và có trị trả về là void. Phương thức set có thể ghi vào cơ sở dữ liệu hay cập nhật biến thành viên khi cần. Ví dụ: set { hour = value; }CẢM ƠN