Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
116,71 KB
Nội dung
Nạp chồng phương thức Nạp chồng phương thức Bởi: Khuyet Danh 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 lại lớp Ví dụ sau 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 Minh họa nạp chồng phương thức khởi dựng using System; public class Time { public void DisplayCurrentTime() { 1/14 Nạp chồng phương thức 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; } private int Month; 2/14 Nạp chồng phương thức 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 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 - 3/14 Nạp chồng phương thức 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 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 toàn quyền thay đổi giá trị trả về, tùy chọn Nếu thay đổi giá trị trả 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 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; 4/14 Nạp chồng phương thức 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, 5/14 Nạp chồng phương thức 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ụ bên dưới: 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; 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(); // 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 6/14 Nạp chồng phương thức 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 { return hour; } set { 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; Truy cập lấy liệu (get accessor) Phần khai báo tương tự phương thức lớp dùng để trả đối tượng có kiểu liệu thuộc tính Trong ví dụ trên, truy cập lấy liệu get thuộc tính Hour tương tự phương thức trả giá trị int Nó trả giá trị biến thành viên hour nơi mà giá trị thuộc tính Hour lưu trữ: get { return hour; } Trong ví dụ này, biến thành viên cục trả về, truy cập dễ dàng giá trị nguyên từ sở lịêu, hay thực việc tính toán tùy ý Bất tham chiếu đến thuộc tính gán giá trị thuộc tính cho biến truy cập lấy liệu get thực để đọc giá trị thuộc tính: Time t = new Time( currentTime ); int theHour = t.Hour; Khi lệnh thứ hai thực giá trị thuộc tính trả về, tức truy cập lấy lịêu get thực kết giá trị thuộc tính gán cho biến cục theHour 7/14 Nạp chồng phương thức Bộ truy cập thiết lập liệu ( set accessor) Bộ truy cập thiết lập giá trị cho thuộc tính tương tự phương thức trả giá trị void Khi định nghĩa truy cập thiết lập lịêu phải sử dụng từ khóa value để đại diện cho tham số truyền vào lưu trữ thuộc tính: set { hour = value; } Như nói trước, ta khai báo thuộc tính lưu trữ dạng biến thành viên nên phần thân truy cập ta sử dụng biến thành viên mà Bộ truy cập thiết lập hoàn toàn cho phép viết giá trị vào sở lịêu hay cập nhật biến thành viên khác lớp cần thiết Khi gán giá trị cho thuộc tính truy cập thiết lập liệu set tự động thực tham số ngầm định tạo để lưu giá trị mà ta muốn gán: theHour++; t.Hour = theHour; Lợi ích hướng tiếp cận cho phép thành phần bên (client) tương tác với thuộc tính cách trực tiếp, mà hy sinh việc che dấu lịêu đặc tính đóng gói lịêu thiết kế hướng đối tượng Thuộc tính đọc Giả sử muốn tạo phiên khác cho lớp Time cung cấp số giá trị static để hiển thị ngày hành Ví dụ sau minh họa cho cách tiếp cận Sử dụng thuộc tính static using System; public class RightNow { // Định nghĩa khởi tạo static cho biến 8/14 Nạp chồng phương thức static static RightNow() { System.DateTime dt = System.DateTime.Now; Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; } // Biến thành viên static public static int Year; public static int Month; public static int Date; public static int Hour; public static int Minute; public static int Second; } public class Tester { static void Main() { 9/14 Nạp chồng phương thức Console.WriteLine("This RightNow.Year.ToString()); year: {0}", RightNow.Year = 2003; Console.WriteLine("This year: {0}", RightNow.Year.ToString()); } } Kết quả: This year: 2002 This year: 2003 Đoạn chương trình hoạt động tốt, nhiên có thay đổi giá trị biến thành viên Như ta thấy, biến thành Year thay đổi đến 2003 Điều thực không mong muốn Chúng ta muốn đánh dấu thuộc tính tĩnh không thay đổi Nhưng khai báo không biến tĩnh không khởi tạo phương thức khởi dựng static thi hành Do C# cung cấp thêm từ khóa readonly phục vụ xác cho mục đich Với ví dụ ta có cách khai báo lại sau: public static readonly int Year; public static readonly int Month; public static readonly int Date; public static readonly int Hour; public static readonly int Minute; public static readonly int Second; 10/14 Nạp chồng phương thức Khi ta phải bỏ lệnh gán biến thành viên Year, không bị báo lỗi: // RightNow.Year = 2003; // error Chương trình sau biên dịch thực mục đích Câu hỏi trả lời Có phải nên sử dụng lớp với liệu thành viên? Nói chung không nên sử dụng lớp với liệu thành viên Ý nghĩa môt lớp hay lập trình hướng đối tượng khả đóng gói chức liệu vào gói đơn Có phải tất liệu thành viên luôn khai báo public để bên truy cập chúng? Nói chung không Do vấn đề che dấu liệu lập trình hướng đối tượng,xu hướng liệu bên nên dùng cho phương thức thành viên Tuy nhiên, biết khái niệm thuộc tính cho phép biến thành viên truy cập từ bên thông qua hình thức phương thức Có phải có nhiều lớp xây dựng sẵn tìm chúng đâu? Microsoft cung cấp nhiều lớp gọi lớp sở NET Những lớp tổ chức bên namespace Chúng ta tìm tài liệu lớp thư viện trực tuyến Microsoft Và số lớp thường sử dụng trình bày ví dụ giáo trình Sự khác tham số (parameter) đối mục (argument)? Tham số định nghĩa thứ truyền vào phương thức Một tham số xuất với định nghĩa phương thức đầu phương thức Một đối mục giá trị truyền vào phương thức Chúng ta truyền đối mục vào phương thức phù hợp với tham số khai báo phương thức Chúng ta tạo phương thức bên lớp hay không? Mặc dù ngôn ngữ khác, tạo phương thức bên lớp Nhưng C# không, C# hướng đối tượng, tất mã nguồn phải đặt bên lớp Có phải phương thức lớp C# hoạt động tương tự ngôn ngữ khác C++ hay Java? 11/14 Nạp chồng phương thức Trong hầu hết phần chúng tương tự Tuy nhiên, ngôn ngữ có khác biệt riêng Một ví dụ khác C# không cho phép tham số mặc định bên phương thức Trong ngôn ngữ C++ khai báo tham số mặc định lúc định nghĩa phương thức gọi phương thức không cần truyền giá trị vào, phương thức dùng giá trị mặc định Trong C# không phép Nói chung nhiều khác nữa, xin dành cho bạn đọc tự tìm hiểu Phương thức tĩnh truy cập thành viên không truy cập thành viên lớp? Phương thức tĩnh truy cập thành viên tĩnh lớp Câu hỏi thêm Sự khác thành viên khai báo public thành viên không khai báo public? Từ khoá sử dụng việc thực thi thuộc tính lớp? Những kiểu liệu trả từ phương thức? Sự khác truyền biến tham chiếu truyền biến tham trị vào phương thức? Làm truyền tham chiếu với biến kiểu giá trị vào phương thức? Khi phương thức khởi dựng gọi? Câuhỏi 7: Phương thức khởi dựng tĩnh gọi nào? Có thể truyền biến chưa khởi tạo vào hàm không? Câuhỏi 9: Sự khác lớp đối tượng lớp? Thành viên lớp truy cập mà tạo thể lớp? Lớp mà xây dựng thuộc kiểu liệu nào? Câuhỏi 12: Từ khóa this dùng làm lớp? Bài tập Xây dựng lớp đường tròn lưu giữ bán kính tâm đường tròn Tạo phương thức để tính chu vi, diện tích đường tròn Thêm thuộc tính BanKinh vào lớp tạo từ tập 12/14 Nạp chồng phương thức Tạo lớp lưu trữ giá trị nguyên tên myNumber Tạo thuộc tính cho thành viên Khi số lưu trữ nhân cho 100 Và số truy cập chia cho 100 Chương trình sau có lỗi Hãy sửa lỗi chương trình biên dịch chương trình Dòng lệnh gây lỗi? using System; using System.Console; class VD1 { public string first; } class Tester { public static void Main() { VD1 vd = new VD1(); Write("Nhap vao mot chuoi: "); vd.first = ReadLine(); Write("Chuoi nhap vao: {0}", vd.first); } } Chương trình sau có lỗi Hãy sửa lỗi chương trình biên dịch chương trình Dòng lệnh gây lỗi? class Class1 { public static void GetNumber(ref int x, ref int y) { x = 5; y = 10; } public static void Main() { int a = 0, b = 0; GetNumber(a, b); System.Console.WriteLine("a = {0} \nb = {1}", a, b); } } Chương trình sau có lỗi Hãy sửa lỗi cho biết lệnh phát sinh lỗi? Class Tester { public static void Main() { Display(); } 13/14 Nạp chồng phương thức public static void Display() { System.Console.WriteLine("Hello!"); return 0; } } Viết lớp giải phương trình bậc hai Lớp có thuộc tính a, b, c nghiệm x1, x2 Hãy xây dựng theo hướng đối tượng lớp Lớp cho phép bên xem nghiệm phương trình cho phép thiết lập hay xem giá trị a, b, c 14/14 [...]... truyền vào trong một phương thức Một tham số xuất hiện với định nghĩa của phương thức ở đầu phương thức Một đối mục là giá trị được truyền vào phương thức Chúng ta truyền những đối mục vào phương thức phù hợp với những tham số đã khai báo của phương thức Chúng ta có thể tạo phương thức bên ngoài của lớp hay không? Mặc dù trong những ngôn ngữ khác, chúng ta có thể tạo các phương thức bên ngoài của lớp... dụng trong việc thực thi thuộc tính của lớp? Những kiểu dữ liệu nào được trả về từ phương thức? Sự khác nhau giữa truyền biến tham chiếu và truyền biến tham trị vào một phương thức? Làm sao truyền tham chiếu với biến kiểu giá trị vào trong một phương thức? Khi nào thì phương thức khởi dựng được gọi? Câuhỏi 7: Phương thức khởi dựng tĩnh được gọi khi nào? Có thể truyền biến chưa khởi tạo vào một hàm... tham số mặc định lúc định nghĩa phương thức và khi gọi phương thức thì có thể không cần truyền giá trị vào, phương thức sẽ dùng giá trị mặc định Trong C# thì không được phép Nói chung là còn nhiều sự khác nhau nữa, nhưng xin dành cho bạn đọc tự tìm hiểu Phương thức tĩnh có thể truy cập được thành viên nào và không truy cập được thành viên nào trong một lớp? Phương thức tĩnh chỉ truy cập được các thành... những phương thức và lớp trong C# hoạt động tương tự như trong các ngôn ngữ khác như C++ hay Java? 11/14 Nạp chồng phương thức Trong hầu hết các phần thì chúng tương tự như nhau Tuy nhiên, mỗi ngôn ngữ cũng có những khác biệt riêng Một ví dụ sự khác nhau là C# không cho phép tham số mặc định bên trong một phương thức Trong ngôn ngữ C++ thì chúng ta có thể khai báo các tham số mặc định lúc định nghĩa phương. .. Câuhỏi 12: Từ khóa this được dùng làm gì trong một lớp? Bài tập Xây dựng một lớp đường tròn lưu giữ bán kính và tâm của đường tròn Tạo các phương thức để tính chu vi, diện tích của đường tròn Thêm thuộc tính BanKinh vào lớp được tạo ra từ bài tập 1 12/14 Nạp chồng phương thức Tạo ra một lớp lưu trữ giá trị nguyên tên myNumber Tạo thuộc tính cho thành viên này Khi số được lưu trữ thì nhân cho 100 Và khi... public static void Main() { Display(); } 13/14 Nạp chồng phương thức public static void Display() { System.Console.WriteLine("Hello!"); return 0; } } Viết lớp giải phương trình bậc hai Lớp này có các thuộc tính a, b, c và nghiệm x1, x2 Hãy xây dựng theo hướng đối tượng lớp trên Lớp cho phép bên ngoài xem được các nghiệm của phương trình và cho phép thiết lập hay xem... là không Do vấn đề che dấu dữ liệu trong lập trình hướng đối tượng,xu hướng là dữ liệu bên trong chỉ nên dùng cho các phương thức thành viên Tuy nhiên, như chúng ta đã biết khái niệm thuộc tính cho phép các biến thành viên được truy cập từ bên ngoài thông qua hình thức như là phương thức Có phải có rất nhiều lớp được xây dựng sẵn và tôi có thể tìm chúng ở đâu? Microsoft cung cấp rất nhiều các lớp gọi.. .Nạp chồng phương thức Khi đó ta phải bỏ lệnh gán biến thành viên Year, vì nếu không sẽ bị báo lỗi: // RightNow.Year = 2003; // error Chương trình sau khi biên dịch và thực hiện như mục đích của chúng ta Câu hỏi ... chọn Nếu thay đổi giá trị trả 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 Nạp chồng phương thức ... vào phương thức Một tham số xuất với định nghĩa phương thức đầu phương thức Một đối mục giá trị truyền vào phương thức Chúng ta truyền đối mục vào phương thức phù hợp với tham số khai báo phương. .. - 3/14 Nạp chồng phương thức 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 biết gọi phương thức khởi tạo hai đối