Bài giảng tóm tắt Lập trình hướng đối tượng
MỤC LỤC
I. Giới thiệu lập trình hướng đối tượng.4
I.1. Lập trình hướng thủtục (Pascal, C, ) .4
I.2. Lập trình hướng đối tượng (Object-oriented programming ) .4
I.2.1. Tính đóng gói.5
I.2.2. Tính kếthừa.5
I.2.3. Tính đa hình.5
I.2.4. Ưu điểm của phương pháp lập trình hướng đối tượng.5
II. Lớp và đối tượng .5
II.1. Định nghĩa lớp.5
II.2. Tạo đối tượng .7
II.3. Phương thức tạo lập (constructor) của một đối tượng .9
II.4. Phương thức tạo lập sao chép (copy constructor) .11
II.5. Quá tải hàm .12
II.6. Sửdụng các thành viên tĩnh .15
II.7. Tham sốcủa phương thức .18
II.7.1. Truyền tham trịbằng tham sốkiểu giá trị.18
II.7.2. Truyền tham chiếu bằng tham sốkiểu giá trịvới từkhóa ref.19
II.7.3. Truyền tham chiếu với tham sốkiểu giá trịbằng từkhóa out.20
II.7.4. Truyền tham trịvới tham sốthuộc kiểu tham chiếu.21
II.7.5. Truyền tham chiếu với tham sốthuộc kiểu dữliệu tham chiếu.24
II.8. Tham chiếu this .25
II.9. Đóng gói dữliệu với thuộc tính (property) .27
II.10. Toán tử(operator) .30
II.11. Indexer (Chỉmục) .34
II.12. Lớp lồng nhau .38
II.13. Câu hỏi ôn tập .38
II.14. Bài tập tổng hợp .39
III. Kếthừa (inheritance) và đa hình (polymorphism).40
III.1. Quan hệchuyên biệt hóa và tổng quát hóa .40
III.2. Kếthừa.40
III.3. Gọi phương thức tạo lập của lớp cơsở.42
III.4. Định nghĩa phiên bản mới trong lớp dẫn xuất .44
III.5. Tham chiếu thuộc lớp cơsở.46
III.6. Phương thức ảo (virtual method) và tính đa hình (polymorphism) .48
III.7. Lớp Object .55
III.8. Lớp trừu tượng(abstract).55
III.9. Giao diện (interface) .58
III.9.1. Thực thi giao diện.58
III.9.2. Hủy đối tượng.60
III.9.3. Thực thi nhiều giao diện.64
III.9.4. Mởrộng giao diện.66
III.9.5. Kết hợp giao diện.67
III.9.6. Kiểm tra đối tượng có hỗtrợgiao diện hay không bằng toán tử is
.67
III.9.7. Các giao diện Icomparer, IComparable (giao diện so sánh) và
ArrayList.67
III.9.8. Câu hỏi ôn tập.74
III.9.9. Bài tập tổng hợp.74
PHỤLỤC A - CƠBẢN VỀNGÔN NGỮC#
I. Tạo ứng dụng trong C#.75
I.1. Soạn thảo chương trình “Hello World”.76
I.2. Biên dịch và chạy chương trình “Hello World”.77
II. Cơsởcủa ngôn ngữC# .77
II.1. Kiểu dữliệu.77
II.1.1. Các kiểu xây dựng sẵn trong C#:.77
II.1.2. Hằng.78
II.1.3. Kiểu liệt kê.79
II.1.4. Kiểu chuỗi.80
II.2. Lệnh rẽnhánh.80
II.2.1. Lệnh if.80
II.2.2. Lệnh switch.81
II.2.3. Lệnh goto.82
II.2.4. Lệnh lặp while.83
II.2.5. Lệnh do while.83
II.2.6. Lệnh for.84
II.2.7. Lệnh foreach.85
II.2.8. Lệnh continue và break.85
II.3. Mảng.86
II.3.1. Mảng một chiều.86
II.3.2. Mảng nhiều chiều.88
II.3.3. Một sốví dụvềmảng nhiều chiều.89
II.4. Không gian tên (namespace).90
PHỤLỤC B - BIỆT LỆ
I. Ném ra biệt lệ.92
II. Bắt ngoại lệ.92
III. Khối finally .95
IV. Một sốngoại lệkhác:.95
V. Một sốví dụkhác.96
); m = uint.Parse(Console.ReadLine()); A = new float[n][]; int i; for( i = 0; i < n; i++) A[i] = new float[m]; NhapMaTran(A,n, m); Console.WriteLine("Ma tran vua nhap"); XuatMaTran(A,n,m); Console.ReadLine(); } } II.3.3. Một số ví dụ về mảng nhiều chiều Sau đây là một số ví dụ về mảng nhiều chiều: • Khai báo mảng 3 chiều kiểu số nguyên với kích thước mỗi chiều là 4, 2 và 3: int[,,] myArray = new int [4,2,3]; • Khai báo mảng 2 chiều, cấp phát và khởi gán giá trị cho mảng: int[,] myArray = new int[,] { {1,2}, {3,4}, {5,6}, {7,8} }; hoặc int[,] myArray = {{1,2}, {3,4}, {5,6}, {7,8}}; • Gán giá trị cho một phần tử trong mảng 2 chiều: Lập trình hướng đối tượng Phạm Quang Huy 2008 90 myArray[2,1] = 25; II.4. Không gian tên (namespace) Có thể hiểu không gian tên như là thư viện. Sử dụng không gian tên giúp ta tổ chức mã chương trình tốt hơn, tránh trường hợp hai lớp trùng tên khi sử dụng các thư viện khác nhau. Ngoài ra, không gian tên được xem như là tập hợp các lớp đối tượng, và cung cấp duy nhất các định danh cho các kiểu dữ liệu và được đặt trong một cấu trúc phân cấp. Việc sử dụng không gian tên trong lập trình là một thói quen tốt, bởi vì công việc này chính là cách lưu các mã nguồn để sử dụng về sau. Ngoài thư viện (namespace) do MS.NET và các hãng thứ ba cung cấp, ta có thể tạo riêng cho mình các không gian tên . C# đưa ra từ khóa using để khai báo sử dụng không gian tên trong chương trình: using Trong một không gian tên ta có thể định nghĩa nhiều lớp và không gian tên . Để tạo một không gian tên ta dùng cú pháp sau: namespace { ..... } Ví dụ II.4.1 : Định nghĩa lớp Tester trong namespace Programming_C_Sharp. namespace Programming_C_Sharp { using System; public class Tester { public static int Main( ) { for (int i=0;i<10;i++) { Console.WriteLine("i: {0}",i); } return 0; } } } Ví dụ II.4.2: Khai báo không gian tên lồng nhau: Lập trình hướng đối tượng Phạm Quang Huy 2008 91 namespace Programming_C_Sharp { namespace Programming_C_Sharp_Test1 { using System; public class Tester { public static int Main( ) { for (int i=0;i<10;i++) { Console.WriteLine("i: {0}",i); } return 0; } } } namespace Programming_C_Sharp_Test2 { public class Tester { public static int Main( ) { for (int i=0;i<10;i++) { Console.WriteLine("i: {0}",i); } return 0; } } } } Lập trình hướng đối tượng Phạm Quang Huy 2008 92 Phụ lục B - BIỆT LỆ (NGOẠI LỆ) • Là các dạng lỗi gặp phải khi chạy chương trình (lúc biên dịch chương trình không phát hiện được). Thường là do người dùng gây ra lúc chạy chương trình. • Kết thúc bởi từ khoá Exception. I. Ném ra biệt lệ Để báo động sự bất thường của chương trình. Cú pháp: throw [biểu thức tạo biệt lệ]; Sau khi ném ra một ngoai lệ, các đoạn lệnh sau lệnh throw sẽ bị bỏ qua. Chương trình thực hiện việc bắt ngoại lệ hoặc dừng. II. Bắt ngoại lệ • Để chương trình có tính dung thứ lỗi cao hơn, cho phép vẫn chạy chương trình đối với những lỗi không quá quan trọng. Chẳng hạn khi nhập một giá trị nguyên, người dùng vô tình nhập một ký tự, khi đó không nhất thiết phải dừng chương trình mà chỉ thông báo lỗi và cho phép người dùng nhập lại. • Để chương trình thân thiện hơn đối với người sử dụng. Thông báo lỗi cụ thể, thay vì dạng thông báo lỗi mang tính kỹ thuật khó hiểu của hệ thống. Việc bắt ngoại lệ được thực hiện thông qua khối try { } catch { } như sau: try { Các câu lệnh có thể gây ra biệt lệ. } catch (khai báo biệt lệ 1 ) {các câu lệnh xử lý biệt lệ 1} … catch (khai báo biệt lệ n ) {các câu lệnh xử lý biệt lệ n} • Nếu không có khai báo biệt lệ nào trong khối catch thì khi đó ta bắt tất cả các dạng ngoại lệ do khối try gây ra. Ví dụ: Xét đoạn chương trình using System; class Class1 { static void Main(string[] args) { Lập trình hướng đối tượng Phạm Quang Huy 2008 93 int x=0; Console.WriteLine("Nhap mot so nguyen"); x=int.Parse(Console.ReadLine()); Console.WriteLine("So nguyen vua nhap {0}",x); Console.ReadLine(); } } • Khi chạy chương trình, nếu ta nhập một số nguyên chương trình sẽ chạy tốt. Nếu ta (vô tình) nhập một dữ liệu không phải là số nguyên (chẳng hạn nhập ký tự ‘r’), chương trình sẽ dừng và báo lỗi runtime sau: An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll Additional information: Input string was not in a correct format. Vì vậy, để chương trình có tính dung thứ lỗi (vì đây có thể là lỗi vô tình của người sử dụng) ta cần viết lại như sau để cho người dùng nhập lại: using System; class Class1 { static void Main(string[] args) { int x=0; Console.WriteLine("Nhap mot so nguyen"); NHAPLAI: try { x=int.Parse(Console.ReadLine()); } //catch(System.Exception e) catch(System.FormatException e) { Console.WriteLine("Loi : " + e.ToString()); Console.WriteLine("Khong duoc nhap loai du lieu khac. Hay nhap lai"); goto NHAPLAI; } Console.WriteLine("So nguyen vua nhap {0}",x); Console.ReadLine(); } } Vì đoạn mã x=int.Parse(Console.ReadLine()); có thể gây ra biệt lệ System.FormatException Lập trình hướng đối tượng Phạm Quang Huy 2008 94 nên ta đặt nó trong khối try và khối catch bắt biệt lệ này. Sau đó xuất thông báo lỗi, nhưng không dừng chương trình mà cho phép nhập lại bằng lệnh nhảy tới nhãn NHAPLAI: goto NHAPLAI; Vì mọi loại biệt lệ đều dẫn xuất từ System.Exception nên ta có thể xem mọi biệt lệ là một System.Exception. Do vậy, nếu ta không biết loại biệt lệ là gì ta thay lệnh catch(FormatException e) bằng lệnh: catch(Exception e) Nếu muốn bắt mọi ngoại lệ nhưng không thông báo lỗi ta có thể sử dụng khối catch rỗng như sau: catch { Console.WriteLine("Khong duoc nhap loai du lieu khac. Hay nhap lai"); goto NHAPLAI; } Khi đó chương trình cho phép nhập lại nhưng không thông báo cho người dùng lỗi là gì. Ví dụ 2: Bắt nhiều ngoại lệ using System; class Class1 { static void Main(string[] args) { byte x=0; NHAPLAI: Console.WriteLine("Nhap mot so nguyen"); try { x=byte.Parse(Console.ReadLine()); } //catch(System.Exception e) catch(FormatException e1) { Console.WriteLine("Loi : " +e1.ToString()); Console.WriteLine("Khong duoc nhap loai du lieu khac. Hay nhap lai"); goto NHAPLAI; } catch(OverflowException e2) { Console.WriteLine("Loi : " +e2.ToString()); Lập trình hướng đối tượng Phạm Quang Huy 2008 95 Console.WriteLine("So phai thuoc doan [0..256]. Hay nhap lai"); goto NHAPLAI; } Console.WriteLine("So nguyen vua nhap {0}",x); Console.ReadLine(); } } Khi một ngoại lệ phát sinh, chương trình sẽ nhảy ngay tới khối catch gần nhất có thể bắt ngoại lệ hoặc dừng nếu không có khối catch nào có thể bắt ngoại lệ này. III. Khối finally Khi đặt khối finally sau các khối catch thì cho dù có biệt lệ hay không chương trình vẫn không dừng mà sẽ thực hiện khối finally. (Nếu bắt được ngoại lệ thì chương trình sẽ thực hiện khối catch tương ứng trước khi thực hiện khối finally). Hãy thử thêm đoạn lệnh sau vào ví dụ trên. finally { Console.WriteLine("So nguyen vua nhap {0}",x); } IV. Một số ngoại lệ khác: • System.OutOfMemoryException: Lỗi không thể cấp phát bộ nhớ. • System.StackOverflowException: Lỗi tràn stack. Thường là do gọi đệ qui quá sâu hoặc gọi đệ qui bị lặp vô tận. • System.NullReferenceException: Lỗi xảy ra khi truy cập tới một tham chiếu trỏ tới null trong khi cần một tham chiếu trỏ tới một đối tượng thực sự hiện hữu. • System.TypeInitializationException: Hàm constructor ném ra một ngoại lệ nhưng không có ngoại lệ catch nào bắt ngoại lệ này. • System.InvalidCastException: Xảy ra khi không thể thực hiện việc ép kiểu tường minh từ một kiểu cơ sở hoặc một giao diện sang một kiểu dẫn xuất. • System.ArrayTypeMismatchException: Kiểu của giá trị cần lưu vào mảng không hợp kiểu với kiểu của mảng. • System.IndexOutOfRangeException: Truy cập ngoài mảng. • System.MulticastNotSupportedException: Lỗi liên quan tới việc không thể kết hợp 2 delegate không null vì kiểu trả về của delegate không phải là void. • System.ArithmeticException: Lỗi số học. Chẳng hạn chia cho 0, tràn dữ liệu. Lập trình hướng đối tượng Phạm Quang Huy 2008 96 • System.DivideByZeroException: Lỗi chia cho 0 • System.OverflowException: Tràn dữ liệu. Chẳng hạn gán dữ liệu quá lớn cho một biến kiểu byte. • ... V. Một số ví dụ khác Nên bắt biệt lệ cụ thể trước, biệt lệ tổng quát using System; public class Test { public static void Main( ) { Test t = new Test( ); t.CanAChiaB(4,-5 ); Console.ReadLine(); } public void CanAChiaB(int a,int b) { try { if (b == 0) throw new DivideByZeroException( ); if (a*b<= 0) throw new ArithmeticException( ); else { double kq = Math.Sqrt(a/b); Console.WriteLine ("Ket qua = {0}",kq ); } } // Bat ngoai le cu the truoc catch (DivideByZeroException) { Console.WriteLine("Loi chia cho 0!"); } //Bat ngoai le tong quat sau; catch (ArithmeticException) { Console.WriteLine("Co loi so hoc gi gi do...hehe!"); } } } Lập trình hướng đối tượng Phạm Quang Huy 2008 97 TÀI LIỆU THAM KHẢO 1) Phạm Hữu Khang, C# 2005 cơ bản, Nxb Lao Động Xã Hội, 2006. 2) Phạm Hữu Khang, C# 2005 Tập 2-Lập trình Windows Form, Nxb Lao Động Xã Hội, 2006. 3) Dương Quang Thiện, Lập trình Visual C# như thế nào? Tập 1,2,3, Nxb Tổng hợp Tp HCM, 2005. 4) Ths.Nguyễn Cẩn, Tự học ngôn ngữ lập trình C++,Nbx Đồng Nai,1996 . 5) Jesse Liberty, Programming C#, 2nd Edition, tr 1-320 ,Nxb OReilly. 6) Ben Albahari, CSharp Essentials, 2nd Edition, tr 1-88, Nxb OReilly. 7) VN-Guide, Lập trình Java, Nxb Thống Kê, 2000.
File đính kèm:
- GT_OOP.pdf