Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 15 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
15
Dung lượng
182,69 KB
Nội dung
Ví dụ 4.8: Sử dụng tham số using System; public class Time { public void DisplayCurrentTime() { Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”, Date, Month, Year, Hour, Minute, Second); } public int GetHour() { return Hour; } public void SetTime(int hr, out int min, ref int sec) { // Nếu số giây truyền vào >30 tăng số Minute Second = if ( sec >=30 ) { Minute++; Second = 0; } Hour = hr; // thiết lập giá trị hr truyền vào // Trả giá trị cho sec = Minute; sec = Second; } 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; } public class Tester { static void Main() { System.DateTime currentTime = System.DateTime.Now; Time t = new Time(currentTime); t.DisplayCurrentTime(); int theHour = 3; int theMinute; int theSecond = 20; t.SetTime( theHour, out theMinute, ref theSecond); Console.WriteLine(“The Minute is now: {0} and {1} seconds ”, theMinute, theSecond); theSecond = 45; t.SetTime( theHour, out theMinute, ref theSecond); Console.WriteLine(“The Minute is now: {0} and {1} seconds”, theMinute, theSecond); } } -Kết quả: 8/6/2002 15:35:24 The Minute is now: 35 and 24 seconds The Minute is now: 36 and seconds Phương thức SetTime minh họa việc sử dụng ba kiểu truyền tham số vào phương thức Tham số thứ theHour truyền vào dạng giá trị, mục đích tham số để thiết lập giá trị cho biến thành viên Hour tham số không sử dụng để giá trị Tham số thứ hai theMinute truyền vào phương thức để nhận giá trị trả biến thành viên Minute, tham số khai báo với từ khóa out Cuối tham số theSecond truyền vào với khai báo ref, biến tham số vừa dùng để thiết lập giá trị phương thức Nếu theSecond lớn 30 giá trị biến thành viên Minute tăng thêm đơn vị biến thành viên Second thiết lập Sau theSecond gán giá trị biến thành viên Second trả Do hai biến theHour theSecond sử dụng phương thức SetTime nên phải khởi tạo trước truyền vào phương thức Còn với biến theMinute khơng cần thiết khơng sử dụng phương thức mà nhận giá trị trả Nạp chồng phương thức Thông thường xây dựng lớp, ta có mong muốn tạo nhiều hàm có tên Cũng hầu hết ví dụ trước lớp điều có nhiều phương thức khởi dựng Như lớp Time có phương thức khởi dựng nhận tham số khác nhau, tham số đối tượng DateTime, hay tham số tùy chọn để thiết lập giá trị biến thành viên thông qua tham số nguyên Tóm lại ta xây dựng nhiều phương thức tên nhận tham số khác Chức gọi nạp chồng phương thức Một ký hiệu (signature) phương thức định nghĩa tên phương thức với danh sách tham số phương thức Hai phương thức khác ký hiệu chúng khác khác tức khác tên phương thức khác hay danh sách tham số khác Danh sách tham số xem khác số lượng tham số kiểu liệu tham số Ví dụ đoạn mã sau, phương thức thứ khác phương thức thứ hai số lượng tham số khác Phương thức thứ hai khác phương thức thứ ba kiểu liệu tham số khác nhau: void myMethod( int p1 ); void myMethod( int p1, int p2 ); void myMethod( int p1, string p2 ); Một lớp có số lượng phương thức nào, phương thức lớp phải có ký hiệu khác với tất phương thức thành viên cịn lại lớp Ví dụ 4.9 minh họa lớp Time có hai phương thức khởi dựng, phương thức nhận tham số đối tượng DateTime phương thức thứ hai nhận sáu tham số nguyên Ví dụ 4.9: Minh họa nạp chồng phương thức khởi dựng using System; public class Time { public void DisplayCurrentTime() { Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”, Date, Month, Year, Hour, Minute, Second); } 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; } // Biến thành viên private p private int Year; r private int Month; i private int Date; v private int Hour; a private int Minute; t e int Second; } public class Tester { static void Main() { System.DateTime currentTime = System.DateTime.Now; Time t1 = new Time( currentTime); t1.DisplayCurrentTime(); Time t2 = new Time(2002,6,8,18,15,20); t2.DisplayCurrentTime(); } } Kết quả: 2/1/2002 17:50:17 8/6/2002 18:15:20 Như thấy, lớp Time ví dụ minh họa 4.9 có hai phương thức khởi dựng Nếu hai phương thức có ký hiệu trình biên dịch khơng thể biết gọi phương thức khởi tạo hai đối tượng t1 t2 Tuy nhiên, ký hiệu hai phương thức khác tham số truyền vào khác nhau, trình biên dịch xác định phương thức gọi dựa vào tham số Khi thực nạp chồng phương thức, bắt buộc phải thay đổi ký hiệu phương thức, số tham số, hay kiểu liệu tham số Chúng ta tồn quyền thay đổi giá trị trả về, tùy chọn Nếu thay đổi giá trị trả khơng phải nạp chồng phương thức mà hai phương thức khác nhau, tạo hai phương thức ký hiệu khác kiểu giá trị trả tạo lỗi biên dịch Ví dụ 4.10: Nạp chồng phương thức using System; public class Tester { private int Triple( int val) { return 3*val; } private long Triple(long val) { return 3*val; } public void Test() { int x = 5; int y = Triple(x); Console.WriteLine(“x: {0} y: {1}”, x, y); long lx = 10; long ly = Triple(lx); Console.WriteLine(“lx: {0} ly:{1}”, lx, ly); } static void Main() { Tester t = new Tester(); t.Test(); } } Kết quả: x: y: 15 lx: 10 ly:30 - Trong ví dụ này, lớp Tester nạp chồng hai phương thức Triple(), phương thức nhận tham số nguyên int, phương thức lại nhận tham số số nguyên long Kiểu giá trị trả hai phương thức khác nhau, điều khơng địi hỏi thích hợp trường hợp Đóng gói liệu với thành phần thuộc tính Thuộc tính khái niệm cho phép truy cập trạng thái lớp thay thơng qua truy cập trực tiếp biến thành viên, đựơc thay việc thực thi truy cập thông qua phương thức lớp Đây thật điều lý tưởng Các thành phần bên (client) muốn truy cập trạng thái đối tượng không muốn làm việc với phương thức Tuy nhiên, người thiết kế lớp muốn dấu trạng thái bên lớp mà xây dựng, cung cấp cách gián tiếp thơng qua phương thức Thuộc tính đặc tính giới thiệu ngơn ngữ C# Đặc tính cung cấp khả bảo vệ trường liệu bên lớp việc đọc viết chúng thơng qua thuộc tính Trong ngơn ngữ khác, điều thực thơng qua việc tạo phương thức lấy liệu (getter method) phương thức thiết lập liệu (setter method) Thuộc tính thiết kế nhắm vào hai mục đích: cung cấp giao diện đơn cho phép truy cập biến thành viên, Tuy nhiên cách thức thực thi truy cập giống phương thức liệu che dấu, đảm bảo cho yêu cầu thiết kế hướng đối tượng Để hiểu rõ đặc tính ta xem ví dụ 4.11 bên dưới: Ví dụ 4.11: Sử dụng thuộc tính using System; public class Time { public void DisplayCurrentTime() { Console.WriteLine(“Time\t: {0}/{1}/{2} {3}:{4}:{5}”, date, month, year, hour, minute, second); } public Time( System.DateTime dt) { year = dt.Year; month = dt.Month; date = dt.Day; hour = dt.Hour; minute = dt.Minute; second = dt.Second; } public int Hour { get { return hour; } set { hour = value; } } // Biến thành viên private private int year; p r i vate 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(); // Lấy liệu từ thuộc tính Hour int theHour = t.Hour; Console.WriteLine(“ Retrieved the hour: {0}”, theHour); theHour++; t.Hour = theHour; Console.WriteLine(“Updated the hour: {0}”, theHour); } } Kết quả: Time : 2/1/2003 17:55:1 Retrieved the hour: 17 Updated the hour: 18 Để khai báo thuộc tính, khai báo tên thuộc tính để truy cập, phần thân định nghĩa thuộc tính nằm cập dấu ({}) Bên thân thuộc tính khai báo hai truy cập lấy thiết lập liệu: public int Hour { get { } set { } retur n hour; hour = value; } Mỗi truy cập khai báo riêng biệt để làm hai công việc khác lấy hay thiết lập giá trị cho thuộc tính Giá trị thuộc tính lưu sở liệu, phần thân truy cập thực công việc tương tác với sở lịêu Hoặc giá trị thuộc tính lưu trữ biến thành viên lớp ví dụ: private int hour; ... xây dựng lớp, ta có mong muốn tạo nhiều hàm có tên Cũng hầu hết ví dụ trước lớp điều có nhiều phương thức khởi dựng Như lớp Time có phương thức khởi dựng nhận tham số khác nhau, tham số đối tượng. .. string p2 ); Một lớp có số lượng phương thức nào, phương thức lớp phải có ký hiệu khác với tất phương thức thành viên cịn lại lớp Ví dụ 4. 9 minh họa lớp Time có hai phương thức khởi dựng, phương... thức lớp Đây thật điều lý tưởng Các thành phần bên (client) muốn truy cập trạng thái đối tượng không muốn làm việc với phương thức Tuy nhiên, người thiết kế lớp muốn dấu trạng thái bên lớp mà xây