Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
1,87 MB
Nội dung
Ngơn Ngữ Lập Trình C# Khơng định nghĩa định danh Sử dụng thị tiền xử lý #undef để xác định trạng thái định danh không định nghĩa Như biết trình tiền xử lý thực từ xuống dưới, định danh khai báo bên với thị #define có hiệu đến gọi câu lệnh #undef định danh hay đến cuối chương trình: #define DEBUG #if DEBUG // Đoạn code biên dịch #endif #undef DEBUG #if DEBUG // Đoạn code không biên dịch #endif DEBUG định nghĩa, #if thứ hai sai khơng biên dịch DEBUG định nghĩa lại #undef Ngồi cịn có thị #elif #else cung cấp dẫn phức tạp Chỉ dẫn #elif cho phép sử dụng logic “else-if” Ta diễn giải dẫn sau: “Nếu DEBUG làm cơng việc 1, ngược lại TEST làm cơng việc 2, sai tất làm trường hợp 3”: #if #if DEBUG // Đoạn code biên dịch DEBUG định nghĩa #elif TEST //Đoạn code biên dịch DEBUG không định nghĩa // TEST định nghĩa #else //Đoạn code biên dịch DEBUG //TEST không định nghĩa #endif Trong ví dụ thị tiền xử lý #if kiểm tra định danh DEBUG, định danh DEBUG định nghĩa đoạn mã nguồn #if #elif biên dịch, tất phần lại thị #endif không biên dịch Nếu DEBUG không định nghĩa #elif kiểm tra định danh TEST, đoạn mã #elif #else 81 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# thực thi TEST định nghĩa Cuối hai DEBUG TEST không định nghĩa đoạn mã nguồn #else #endif biên dịch Câu hỏi trả lời Câu hỏi 1: Sự khác dựa thành phần (Component-Based) hướng đối tượng (Object- Oriented)? Trả lời 1: Phát triển dựa thành phần xem mở rộng lập trình hướng đối tượng Một thành phần khối mã nguồn riêng thực nhiệm vụ đặc biệt Lập trình dựa thành phần bao gồm việc tạo nhiều thành phần tự hoạt động dùng lại Sau liên kết chúng lại để xây dựng ứng dụng Câu hỏi 2: Những ngôn ngữ khác xem hướng đối tượng? Trả lời 2: Các ngôn ngữ C++, Java, SmallTalk, Visual Basic.NET sử dụng cho lập trình hướng đối tượng Cịn nhiều ngơn ngữ khác không phổ biến Câu hỏi 3: Tại kiểu số không nên khai báo kiểu liệu lớn thay dùng kiểu liệu nhỏ hơn? Trả lời 3: Mặc dù điều xem hợp lý, thật không hiệu Chúng ta không nên sử dụng nhiều tài nguyên nhớ mức cần thiết Khi vừa lãng phí nhớ lại vừa hạn chế tốc độ chương trình Câu hỏi 4: Chuyện xảy ta gán giá trị âm vào biến kiểu không dấu? Trả lời 4: Chúng ta nhận lỗi trình biên dịch nói khơng thể gán giá trị âm cho biến không dấu trường hợp ta gán giá trị âm Còn trường hợp kết âm đựơc tính biểu thức chạy chương trình nhận lỗi liệu Việc kiểm tra xử lý lỗi liệu đựơc trình bày phần sau Câu hỏi 5: Những ngôn ngữ khác hỗ trở Common Type System (CTS) Common Language Runtime (CLR)? Trả lời 5: Microsoft Visual Basic (Version 7), Visual C++.NET hỗ trợ CTS Thêm vào số phiên ngôn ngữ khác chuyển vào CTS Bao gồm Python, COBOL, Perl, Java Chúng ta xem trang web Microsoft để biết thêm chi tiết Câu hỏi 6: Có phải cịn câu lệnh điều khiển khác? Trả lời 6: Đúng, câu lệnh sau: throw, try, catch finally Chúng ta học chương xử lý ngoại lệ Câu hỏi 7: Có thể sử dụng chuỗi với câu lệnh switch? Trả lời 7: Hoàn toàn được, sử dụng biến giá trị chuỗi switch sau dùng giá trị chuỗi câu lệnh case Lưu ý chuỗi ký tự đơn giản nằm hai dấu ngoặc nháy Câu hỏi thêm Câu hỏi 1: Có cách khai báo comment ngôn ngữ C#, cho biết chi tiết? 82 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# Câu hỏi 2: Những từ theo sau từ từ khóa C#: field, cast, as, object, throw, football, do, get, set, basketball Câu hỏi 3: Những khái niệm ngơn ngữ lập trình hướng đối tượng? Câu hỏi 4: Sự khác hai lệnh Write WriteLine? Câu hỏi 5: C# chia làm kiểu liệu chính? Nếu ta tạo lớp tên myClass lớp xếp vào kiểu liệu nào? Câu hỏi 6: Kiểu chuỗi C# kiểu liệu nào? Câu hỏi 7: Dữ liệu biến kiểu liệu tham chiếu lưu đâu nhớ? Câu hỏi 8: Sự khác lớp cấu trúc C#? Khi dùng cấu trúc tốt dùng class? Câu hỏi 8: Sự khác kiểu unsigned signed kiểu số nguyên? Câu hỏi 9: Kiểu liệu nhỏ lưu trữ giá trị 45? Câu hỏi 10: Số lớn nhất, nhỏ kiểu int số nào? Câu hỏi 11: Có bit byte? Câu hỏi 12: Kiểu liệu NET tương ứng với kiểu int C#? Câu hỏi 13: Những từ khóa làm thay đổi luồng chương trình? Câu hỏi 14: Kết 15%4 bao nhiêu? Câu hỏi 15: Sự khác chuyển đổi tường minh chuyển đổi ngầm định? Câu hỏi 16: Có thể chuyển từ giá trị long sang giá trị int hay không? Câu hỏi 17: Số lần tối thiểu lệnh while thực hiện? Câu hỏi 18: Số lần tối thiểu lệnh while thực hiện? Câu hỏi 19: Lệnh dùng để khỏi vịng lặp? Câu hỏi 20: Lệnh dùng để qua vòng lặp kế tiếp? Câu hỏi 21: Khi dùng biến dùng hằng? Câu hỏi 22: Cho biết giá trị CanhCut kiểu liệt kê sau: enum LoaiChim { HaiAu, BoiCa, DaiBang = 50, CanhCut } Câu hỏi 23: Cho biết lệnh phân nhánh C#? Bài tập Bài tập 1: Nhập vào, biên dịch chạy chương trình Hãy cho biết chương trình làm điều gì? 83 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# class BaiTap3_1 { public static void Main() { int x = 0; for(x = 1; x < 10; x++) { System.Console.Write(“{0:03}”, x); } } } Bài tập 2: Tìm lỗi chương trình sau? sửa lỗi biên dịch chương trình class BaiTap3_2 { public static void Main() { for(int i=0; i < 10 ; i++) System.Console.WriteLine(“so :{1}”, i); } } Bài tập 3: Tìm lỗi chương trình sau Sửa lỗi biên dịch lại chương trình using System; class BaiTap3_3 { public static void Main() { double myDouble; decimal myDecimal; myDouble = 3.14; myDecimal = 3.14; Console.WriteLine(“My Double: {0}”, myDouble); Console.WriteLine(“My Decimal: {0}”, myDecimal); } } 84 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# Bài tập 4: Tìm lỗi chương trình sau Sửa lỗi biên dịch lại chương trình class BaiTap3_4 { static void Main() { int value; if (value > 100); System.Console.WriteLine(“Number is greater than 100”); } } Bài tập 5: Viết chương trình hiển thị hình kiểu sau: * ** *** **** ***** ****** a) $$$$$$ $$$$$ $$$$ $$$ $$ $ b) * *** ***** ******* ********* *********** c) Bài tập 6: Viết chương trình hiển hình 85 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# 232 34543 4567654 567898765 67890109876 7890123210987 890123454321098 90123456765432109 0123456789876543210 Bài tập 7: Viết chương trình in ký tự số (0 9) ký tự chữ (a z) với mã ký tự tương ứng ký tự Ví dụ: ‘0’ : 48 ‘1’ : 49 Bài tập 8: Viết chương trình giải phương trình bậc nhất, cho phép người dùng nhập vào giá trị a, b Bài tập 9: Viết chương trình giải phương trình bậc hai, cho phép người dùng nhập vào giá trị a, b, c Bài tập 10: Viết chương trình tính chu vi diện tích hình sau: đường trịn, hình chữ nhật, hình thang, tam giác 86 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# Chương XÂY DỰNG LỚP - ĐỐI TƯỢNG Định nghĩa lớp Thuộc tính truy cập Tham số phương thức Tạo đối tượng Khởi tạo biến thành viên Bộ khởi dựng chép Bộ khởi dựng Từ khóa this Sử dụng thành viên static Gọi phương thức static Sử dụng khởi dựng static Sử dụng khởi dựng private Sử dụng thuộc tính static Hủy đối tượng Truyền tham số Nạp chồng phương thức Đóng gói liệu với thành phần thuộc tính Thuộc tính đọc Câu hỏi & tập Chương thảo luận nhiều kiểu liệu ngôn ngữ C#, int, long and char Tuy nhiên trái tim linh hồn C# khả tạo kiểu liệu mới, phức 87 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# tạp Người lập trình tạo kiểu liệu cách xây dựng lớp đối tượng vấn đề cần thảo luận chương Đây khả để tạo kiểu liệu mới, đặc tính quan trọng ngơn ngữ lập trình hướng đối tượng Chúng ta xây dựng kiểu liệu ngôn ngữ C# cách khai báo định nghĩa lớp Ngồi ta định nghĩa kiểu liệu với giao diện (interface) bàn Chương sau Thể lớp gọi đối tượng (object) Những đối tượng tạo nhớ chương trình thực Sự khác lớp đối tượng giống khác khái niệm loài mèo mèo Mun nằm bên chân ta Chúng ta đụng chạm hay đùa giỡn với khái niệm mèo thực điều với mèo Mun, thực thể sống động, không trừu tượng khái niệm họ lồi mèo Một họ mèo mơ tả mèo có đặc tính: có trọng lượng, có chiều cao, màu mắt, màu lơng, chúng có hành động ăn ngủ, leo trèo, mèo, ví dụ mèo Mun chẳng hạn, có trọng lượng xác định kg, chiều cao 15 cm, màu mắt đen, lơng đen Nó có khả ăn ngủ leo trèo, Lợi ích to lớn lớp ngôn ngữ lập trình khả đóng gói thuộc tính tính chất thực thể khối đơn, tự có nghĩa, tự khả trì Ví dụ muốn nội dung thể hay đối tượng lớp điều khiển ListBox Windows, cần gọi đối tượng chúng tự xếp, việc chúng làm ta khơng quan tâm, cần biết nhiêu thơi Đóng gói với đa hình (polymorphism) kế thừa (inheritance) thuộc tính yếu ngơn ngữ lập trình hướng đối tượng Chương trình bày đặc tính ngơn ngữ lập trình C# để xây dựng lớp đối tượng Thành phần lớp, hành vi thuộc tính, xem thành viên lớp (class member) Tiếp theo chương trình khái niệm phương thức (method) dùng để định nghĩa hành vi lớp, trạng thái biến thành viên hoạt động lớp Một đặc tính mà ngơn ngữ C# đưa để xây dựng lớp khái niệm thuộc tính (property), thành phần thuộc tính hoạt động giống cách phương thức để tạo lớp, chất phương thức tạo lớp giao diện cho bên tương tác với biến thành viên cách gián tiếp, ta bàn sâu vấn đề chương Định nghĩa lớp Để định nghĩa kiểu liệu hay lớp phải khai báo sau định nghĩa thuộc tính phương thức kiểu liệu Khai báo lớp cách sử dụng từ khoá class Cú pháp đầy đủ khai báo lớp sau: [Thuộc tính] [Bổ sung truy cập] class [: Lớp sở] { 88 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# } Thành phần thuộc tính đối tượng trình bày chi tiết chương sau, thành phần bổ sung truy cập trình bày tiếp mục Định danh lớp tên lớp người xây dựng chương trình tạo Lớp sở lớp mà đối tượng kế thừa để phát triển ta bàn sau Tất thành viên lớp định nghĩa bên thân lớp, phần thân bao bọc hai dấu ({}) Ghi chú: Trong ngôn ngữ C# phần kết thúc lớp đấu chấm phẩy giống khai báo lớp ngơn ngữ C/C++ Tuy nhiên người lập trình thêm vào trình biên dịch C# chấp nhận mà không đưa cảnh báo lỗi Trong C#, chuyện xảy lớp Như ví dụ mà tìm hiểu chương 3, hàm điều đưa vào lớp, kể hàm đầu vào chương trình (hàm Main()): public class Tester { public static int Main() { // } } Điều cần nói chưa tạo thể lớp, tức tạo đối tượng cho lớp Tester Điều khác lớp thể lớp? để trả lới cho câu hỏi bắt đầu xem xét khác kiểu liệu int biến kiểu int Ta có viết sau: int var1 = 10; nhiên ta viết int = 10; Ta gán giá trị cho kiểu liệu, thay vào ta gán liệu cho đối tượng kiểu lịêu đó, trường hợp đối tượng biến var1 Khi tạo lớp mới, việc định nghĩa thuộc tính hành vi tất đối tượng lớp Giả sử lập trình để tạo điều khiển ứng dụng Windows, điều khiển giúp cho người dùng tương tác tốt với Windows, ListBox, TextBox, ComboBox, Một điều khiển thông dụng ListBox, điều khiển cung cấp danh sách liệt kê mục chọn cho phép người dùng chọn mục tin ListBox có thuộc tính khác nhu: chiều cao, bề dày, vị trí, màu sắc thể hành vi chúng như: chúng thêm bới mục tin, xếp, 89 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# Ngơn ngữ lập trình hướng đối tượng cho phép tạo kiểu liệu lớp ListBox, lớp bao bọc thuộc tính khả như: thuộc tính height, width, location, color, phương thức hay hành vi Add(), Remove(), Sort(), Chúng ta gán liệu cho kiểu ListBox, thay vào ta phải tạo đối tượng cho lớp đó: ListBox myListBox; Một tạo thể lớp ListBox ta gán liệu cho thể Tuy nhiên đoạn lệnh chưa thể tạo đối tượng nhớ được, ta bàn tiếp Bây ta tìm hiểu cách tạo lớp tạo thể thông qua ví dụ minh họa 4.1 Ví dụ tạo lớp có chức hiểu thị thời gian ngày Lớp có hành vi thể ngày, tháng, năm, giờ, phút, giây hành Để làm điều lớp có thuộc tính hay cịn gọi biến thành viên, với phương thức sau: Ví dụ 4.1: Tạo lớp Thoigian đơn giản sau using System; public class ThoiGian { public void ThoiGianHienHanh() { Console.WriteLine(“Hien thi thoi gian hien hanh”); } // Các biến thành viên int Nam; int Thang; int Ngay; int Gio; int Phut; int Giay; } public class Tester { static void Main() { ThoiGian t = new ThoiGian(); t.ThoiGianHienHanh(); } } 90 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# dọn dẹp hay giải phóng tài nguyên mong muốn mà chờ phương thức Finalize() gọi Khi cung cấp phương thức Dispose phải ngưng thu dọn gọi phương thức Finalize() đối tượng Để ngưng thu dọn, gọi phương thức tĩnh lớp GC (garbage collector) GC.SuppressFinalize() truyền tham số tham chiếu this đối tượng Và sau phương thức Finalize() sử dụng để gọi phương thức Dispose() đoạn mã sau: public void Dispose() { // Thực công việc dọn dẹp // Yêu cầu thu dọc GC thực kết thúc GC.SuppressFinalize( this ); } public override void Finalize() { Dispose(); base.Finalize(); } Phương thức Close Khi xây dựng đối tượng, có muốn cung cấp cho người sử dụng phương thức Close(), phương thức Close tự nhiên phương thức Dispose đối tượng có liên quan đến xử lý tập tin Ta xây dựng phương thức Dispose() với thuộc tính private phương thức Close() với thuộc tính public Trong phương thức Close() đơn giản gọi thực phương thức Dispose() Câu lệnh using Khi xây dựng đối tượng chắn người sử dụng gọi hàm Dispose() Và khơng kiểm sốt lúc thu dọn GC thực việc dọn dẹp Do để cung cấp khả mạnh để kiểm soát việc giải phóng tài ngun C# đưa cú pháp dẫn using, cú pháp đảm bảo phương thức Dispose() gọi sớm Ý tưởng khai báo đối tượng với cú pháp using sau tạo phạm vi hoạt động cho đối tượng khối bao dấu ({}) Khi khối phạm vi kết thúc, phương thức Dispose() đối tượng gọi cách tự động Ví dụ 4.6: Sử dụng dẫn using using System.Drawing; class Tester { 106 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# public static void Main() { using ( Font Afont = new Font(“Arial”,10.0f)) { // Đoạn mã sử dụng AFont }// Trình biên dịch gọi Dispose để giải phóng AFont Font TFont = new Font(“Tahoma”,12.0f); using (TFont) { // Đoạn mã sử dụng TFont }// Trình biên dịch gọi Dispose để giải phóng TFont } } Trong phần khai báo đầu ví dụ đối tượng Font khai báo bên câu lệnh using Khi câu lệnh using kết thúc, phương thức Dispose đối tượng Font gọi Còn phần khai báo thứ hai, đối tượng Font tạo bên câu lệnh using Khi định dùng đối tượng ta đặt vào câu lệnh using Và tương tự khối câu lệnh using thực xong phương thức Dispose() font gọi Truyền tham số Như thảo luận chương trước, tham số có kiểu liệu giá trị truyền giá trị vào cho phương thức Điều có nghĩa đối tượng có kiểu giá trị truyền vào cho phương thức, có chép đối tượng tạo bên phương thức Một phương thức thực xong đối tượng chép hủy Tuy nhiên, trường hợp bình thường, ngơn ngữ C# cịn cung cấp khả cho phép ta truyền đối tượng có kiểu giá trị hình thức tham chiếu Ngôn ngữ C# đưa bổ sung tham số ref cho phép truyền đối tượng giá trị vào phương thức theo kiểu tham chiếu Và tham số bổ sung out trường hợp muốn truyền dạng tham chiếu mà không cần phải khởi tạo giá trị ban đầu cho tham số truyền Ngồi ngơn ngữ C# hỗ trợ bổ sung params cho phép phương thức chấp nhận nhiều số lượng tham số Truyền tham chiếu Những phương thức trả giá trị, giá trị tập hợp giá trị Nếu muốn phương thức trả nhiều giá trị cách thực tạo tham số hình thức tham chiếu Khi phương thức ta xử lý 107 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# gán giá trị cho tham số tham chiếu này, kết sau phương thức thực xong ta dùng tham số truyền vào kết trả Ví dụ 4.7 sau minh họa việc truyền tham số tham chiếu cho phương thức Ví dụ 4.7: Trả giá trị trả thơng qua 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 GetTime(int h, int m, int s) { h = Hour; m = Minute; s = Second; } public Time( System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; } private int Year; private int Month; private int Date; private int Hour; private int Minute; private int Second; 108 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# } 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( theHour, theMinute, theSecond); System.Console.WriteLine(“Current time: {0}:{1}:{2}”, theHour, theMinute, theSecond); } } Kết quả: 8/6/2002 14:15:20 Current time: 0:0:0 Như ta thấy, kết xuất dòng cuối ba giá trị 0:0:0, rõ ràng phương thức GetTime() không thực mong muốn gán giá trị Hour, Minute, Second cho tham số truyền vào Tức ba tham số truyền vào dạng giá trị Do để thực mục đích lấy giá trị Hour, Minute, Second phương thức GetTime() có ba tham số truyền dạng tham chiếu Ta thực sau, đầu tiên, thêm thêm khai báo ref vào trước tham số phương thức GetTime(): public void GetTime( ref int h, ref int m, ref int s) { h = Hour; m = Minute; s = Second; } Điều thay đổi thứ hai bổ sung cách gọi hàm GetTime để truyền tham số dạng tham chiếu sau: t.GetTime( ref theHour, ref theMinute, ref theSecond); Nếu không thực bước thứ hai, tức khơng đưa từ khóa ref gọi hàm trình biên dịch C# báo lỗi khơng thể chuyển tham số từ kiểu int sang kiểu ref int 109 Xây Dựng Lớp - Đối Tượng Ngôn Ngữ Lập Trình C# Cuối biên dịch lại chương trình ta kết yêu cầu Bằng việc khai báo tham số tham chiếu, trình biên dịch truyền tham số dạng tham chiếu, thay cho việc tạo chép tham số Khi tham số bên GetTime() tham chiếu đến biến khai báo hàm Main() Như thay đổi với biến điều có hiệu lực tương tự thay đổi hàm Main() Tóm lại chế truyền tham số dạng tham chiếu thực đối tượng đưa vào Cịn chế truyền tham số giá trị tạo đối tượng truyền vào, thay đổi bên phương thức không làm ảnh hưởng đến đối tượng truyền vào dạng giá trị Truyền tham chiếu với biến chưa khởi tạo Ngôn ngữ C# bắt buộc phải thực phép gán cho biến trước sử dụng, khai báo biến kiểu trước có lệnh sử dụng biến phải có lệnh thực việc gán giá trị xác định cho biến Như ví dụ 4.7 trên, không khởi tạo biến theHour, theMinute, biến theSecond trước truyền tham số vào phương thức GetTime() trình biên dịch báo lỗi Nếu sửa lại đoạn mã ví dụ 4.7 sau: int theHour; int theMinute; int theSecond; t.GetTime( ref int theHour, ref int theMinute, ref int theSecond); Việc sử dụng đoạn lệnh khơng phải hồn tồn vơ lý mục đích nhận giá trị đối tượng Time, việc khởi tạo giá trị biến đưa vào không cần thiết Tuy nhiên biên dịch với đoạn mã lệnh báo lỗi sau: Use of unassigned local variable ‘theHour’ Use of unassigned local variable ‘theMinute’ Use of unassigned local variable ‘theSecond’ Để mở rộng cho yêu cầu trường hợp ngôn ngữ C# cung cấp thêm bổ sung tham chiếu out Khi sử dụng tham chiếu out yêu cầu bắt buộc phải khởi tạo tham số tham chiếu bỏ qua Như tham số phương thức GetTime(), tham số không cung cấp thông tin cho phương thức mà đơn giản chế nhận thơng tin đưa bên ngồi Do ta đánh dấu tất tham số tham chiếu out, ta giảm công việc phải khởi tạo biến trước đưa vào phương thức Lưu ý bên phương thức có tham số tham chiếu out tham số phải gán giá trị trước trả Ta có số thay đổi cho phương thức GetTime() sau: public void GetTime( out int h, out int m, out int s) { h = Hour; 110 Xây Dựng Lớp - Đối Tượng Ngôn Ngữ Lập Trình C# m = Minute; s = Second; } cách gọi phương thức GetTime() Main(): t.GetTime( out theHour, out theMinute, out theSecond); Tóm lại ta có cách khai báo tham số phương thức sau: kiểu liệu giá trị truyền vào phương thức giá trị Sử dụng tham chiếu ref để truyền kiểu liệu giá trị vào phương thức dạng tham chiếu, cách cho phép vừa sử dụng có khả thay đổi tham số bên phương thức gọi Tham chiếu out sử dụng để trả giá trị từ phương thức Ví dụ 4.8 sau sử dụng ba kiểu tham số 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) 111 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# { 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 112 Xây Dựng Lớp - Đối Tượng Ngôn Ngữ Lập Trình C# 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 lại lớp 113 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# 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 cịn 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 private int Year; private int Month; private int Date; private int Hour; private int Minute; private int Second; } 114 Xây Dựng Lớp - Đối Tượng Ngôn Ngữ Lập Trình C# 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; 115 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# } 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) 116 Xây Dựng Lớp - Đối Tượng Ngôn Ngữ Lập Trình C# 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; private int month; private int date; 117 Xây Dựng Lớp - Đối Tượng Ngôn Ngữ Lập Trình C# 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 { return hour; } set { hour = value; } 118 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# } 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 tố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 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 hồn tồ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 119 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# 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 ngồi (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ụ 4.12 minh họa cho cách tiếp cận Ví dụ 4.12: Sử dụng thuộc tính static using System; public class RightNow { // Định nghĩa khởi tạo static cho biến 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() 120 Xây Dựng Lớp - Đối Tượng ... Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# 232 34 5 43 4567654 567898765 67890109876 78901 232 10987 8901 234 5 432 1098 901 234 56765 432 109 01 234 567898765 432 10 Bài tập 7: Viết chương trình in ký tự số (0 9) ký... Đối Tượng Ngôn Ngữ Lập Trình C# 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... Phát triển dựa thành phần xem mở rộng lập trình hướng đối tượng Một thành phần khối mã nguồn riêng thực nhiệm vụ đặc biệt Lập trình dựa thành phần bao gồm việc tạo nhiều thành phần tự hoạt động