Bài giảng Ngôn ngữ C# - Bài 3: Hướng đối tượng trong C# - Chử Đức Hoàng

Tính bao gói: Khả năng truy suất vào các thành phần của một đối tượng trong khi vẫn đảm bảo che giấu các đặc tính riêng tư bên trong đối tượng được gọi là tính bao gói. • Tính kế thừa: Tính kế thừa cho phép các đối tượng có thể chia sẻ hay mở rộng các thuộc tính hoặc phương thức mà không phải tiến hành định nghĩa lại. • Tính trừu tượng: Một đặc tả trừu tượng cho ta biết một đối tượng có thể làm gì mà không bận tâm vào việc nó làm như thế nào. • Tính đa hình: Tính đa hình thể hiện khi với cùng một phương thức nhưng có thể có cách ứng xử khác nhau ở những lớp cùng giao diện

pdf34 trang | Chia sẻ: thanhle95 | Lượt xem: 613 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Bài giảng Ngôn ngữ C# - Bài 3: Hướng đối tượng trong C# - Chử Đức Hoàng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Bài 3 HƯỚNG ĐỐI TƯỢNG TRONG C# GV. Chử Đức Hoàng 2TÌNH HUỐNG DẪN NHẬP  Vậy ngôn ngữ lập trình C# làm thế nào để thể hiện và thực hiện công việc quản lý đối tượng trong thực tế trong máy tính? • Những yếu tố chứa thông tin liên quan đến học viên của trường đại học quốc gia như đã phân tích ở bài trước đều được đưa ra để quản lý các đối tượng thực đó là học viên. Người lập trình có trách nhiệm làm cho máy tính có thể liên kết thông tin đó với những đối tượng trong thế giới thực. • Tuy nhiên, máy tính chỉ là một cỗ máy, nó chỉ thực hiện những công việc được lập trình, vì thế người lập trình phải cung cấp cho máy tính những thông tin theo cách thức mà nó cũng nhận thức được cùng những đối tượng như chúng ta nhận thức. 3MỤC TIÊU Trình bày về lập trình hướng đối tượng. Lập trình hướng đối tượng trong C#. Trình bày được cách gọi và khai báo các lớp, đối tượng và các phương thức trong C#. Xây dựng một chương trình C# thể hiện lớp và các thuộc tính. Tạo đối tượng và sử dụng đối tượng đó. 4NỘI DUNG Khái niệm về lập trình hướng đối tượng1 Giới thiệu về lập trình hướng đối tượng trong C#2 Mô tả lớp và tạo đối tượng trong C#3 Lập trình ứng dụng Console với C#4 5• Lập trình hướng đối tượng là phương pháp lập trình lấy đối tượng làm nền tảng để xây dựng thuật toán, xây dựng chương trình • Có sự tương xứng giữa các đối tượng trong chương trình và các đối tượng trên thực tế và có hướng tiếp cận đa dạng. • Đối tượng phần mềm thông thường là sự kết hợp giữa mã lệnh và dữ liệu trong một thể thống nhất. 1.1. MỞ ĐẦU - TRÌNH BÀY VỀ PHƯƠNG PHÁP LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 6• Tính bao gói: Khả năng truy suất vào các thành phần của một đối tượng trong khi vẫn đảm bảo che giấu các đặc tính riêng tư bên trong đối tượng được gọi là tính bao gói. • Tính kế thừa: Tính kế thừa cho phép các đối tượng có thể chia sẻ hay mở rộng các thuộc tính hoặc phương thức mà không phải tiến hành định nghĩa lại. • Tính trừu tượng: Một đặc tả trừu tượng cho ta biết một đối tượng có thể làm gì mà không bận tâm vào việc nó làm như thế nào. • Tính đa hình: Tính đa hình thể hiện khi với cùng một phương thức nhưng có thể có cách ứng xử khác nhau ở những lớp cùng giao diện 1.1.1. CÁC ĐẶC TÍNH CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 7• Khả năng tái sử dụng cao • Ổn định và dễ bảo trì • Chi phí giảm dần • Tăng năng suất lập trình • Tăng chất lượng phần mềm • Tăng tính dễ hiểu của phần mềm • Vòng đời của phần mềm tăng 1.1.2. ƯU ĐIỂM CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 8• Lớp là khái niệm dùng để mô tả một nhóm các đối tượng có những thuộc tính, hành vi và những mối quan hệ thông thường tương tự nhau. • Thuật ngữ lớp có thể hiểu là “lớp các đối tượng (class)” là khuôn mẫu để sinh ra đối tượng, mỗi đối tượng được coi như là một “thể hiện” của lớp với những giá trị thuộc tính cũng như cách thức hoạt động đặc trưng. • Trong C# hỗ trợ đơn thừa kế giữa các lớp và một lớp bắt buộc phải được thừa kế từ một lớp nào đó. 1.1.3. LỚP 91.1.3. LỚP Sơ đồ mô tả lớp Sơ đồ lớp mô tả những đặc điểm khái quát nhất về lớp bao gồm: Tên lớp, các thuộc tính và các phương thức. Sinhvien Tensv: string Sohieusv:int Diemtoan:int Diemly:int Diemhoa:int Diemtb:float Nhap():void Inthongtin():void Tinhtb(): float Tên lớp Thuộc tính Phương thức 10 • Đối tượng là thể hiện (instance) của một lớp. • Mỗi đối tượng có:  Định danh;  Thuộc tính (dữ liệu);  Hành vi (phương thức). Đối tượng là các sinh viên có: Định danh: Sinh viên Thuộc tính: tên, tuổi, số hiệu sinh viên, điểm thi, Hành vi: hàm tạo, nhập dữ liệu sinh viên, tính điểm cho sinh viên, 1.1.4. ĐỐI TƯỢNG 11 1.1.4. ĐỐI TƯỢNG Thuộc tính và hành vi của đối tượng • Thuộc tính là những đặc điểm đặc trưng của đối tượng, thể hiện thông qua những giá trị cụ thể. • Hành vi là những cách thức mà qua đó đối tượng thể hiện sự hoạt động hay chức năng của chúng. Actions: Nhap() Inthongtin() Tinhtb() Name: Anna Sohieusv:122 Diemtoan: 4 Diemly: 5 Diemhoa: 6 Actions: Nhap() Inthongtin() Tinhtb() Name: Jack Sohieusv:123 Diemtoan: 7 Diemly: 8 Diemhoa: 9 12 1.1.4. ĐỐI TƯỢNG Quản lý bộ nhớ khi sử dụng đối tượng. • Stack: khi gọi phương thức, bộ nhớ được yêu cầu cho các tham số và các biến cục bộ. Khi phương thức kết thúc, vùng nhớ được giải phóng. • Heap: Khi tạo một đối tượng sử dụng từ khóa new và lời gọi phương thức khởi tạo. Nó sẽ được giải phóng một cách tự động khi kết thúc. 42 Sinhvien SV Stack Heap 1. void Method(int param){ 2. Sinhvien SV; 3. SV = new Sinhvien(); 4. } int param @ 42 13 Cú pháp khai báo lớp trong C#: [Thuộc tính truy cập] class [:Lớp cơ sở] { <Phần thân lớp gồm: -Các thuộc tính -Các phương thức> } Lưu ý: Phần kết thúc của định nghĩa lớp không có dấu “;” như trong C++. Nếu vẫn để thì trình biên dịch vẫn biên dịch và không báo lỗi. Lớp luôn là kiểu dữ liệu tham chiếu trong C# 1.2. LỚP TRONG C# 14 1.2. LỚP TRONG C# Các thuộc tính truy cập • Public: Không hạn chế giới hạn truy cập. Những thành viên được đánh dấu public có thể được dùng bởi bất kì các phương thức của lớp bao gồm những lớp khác. • Private: Chỉ được truy cập bởi các phương thức trong lớp. • Protected: Chỉ được các phương thức bên trong lớp và những phương thức dẫn xuất từ lớp đó truy cập. • Internal: Được truy cập bởi những phương thức của bất cứ lớp nào trong cùng khối hợp ngữ với nó. • Protected internal: Được truy cập bởi các phương thức của lớp, các phương thức của lớp dẫn xuất của lớp và bất cứ lớp nào trong cùng khối hợp ngữ của nó. 15 1.2. LỚP TRONG C# Ví dụ khai báo một lớp trong C# Ví dụ mô tả lớp Sinhvien: 5. public class Sinhvien { 6. public Sinhvien() 7. { 8. //hàm tạo 9. } 10. } Class Name - Constructor Hàm tạo (Constructor): là hàm đặc biệt giúp tạo và khởi tạo các trạng thái ban đầu cho đối tượng. Nếu không có hàm tạo này thì trình biên dịch tạo một constructor mặc định để khởi tạo một số giá trị mặc định như: gán chuỗi rỗng cho chuỗi, gán 0 cho kiểu số, gán false cho kiểu bool. Sinhvien + Sinhvien() 16 1.2. LỚP TRONG C# Xây dựng lớp Sinhvien Bổ sung cho Sinhvien • Các thuộc tính  tensv: kiểu dữ liệu chuỗi  sohieusv: kiểu dữ liệu số nguyên • Các phương thức:  nhap(): nhập vào thông tin một sinh viên  inthongtin(): in ra thông tin của sinh viên  Tinhtb(): tính điểm trung bình của sinh viên 11. public class Sinhvien { 12. private String tensv; 13. private int sohieusv; 14. 15. public Sinhvien() { 16. // statement 17. } 18. 19. public void nhap() { 20. // statement 21. } 22. public void inthongtin() { 23. // statement 24. } 25. public int tinhtb() { 26. 27. // statement 28. return diemtb; 29. } 30. } Sinhvien - tensvl: String -sohieusv: int + Sinhvien() + nhap(): void + inthongtin(): void + tinhtb(): int 17 • Việc mô tả lớp chỉ có ý nghĩa đặc tả một nhóm đối tượng có chung đặc điểm thuộc tính và phương thức mà chưa thực sự tạo ra một đối tượng. • Lớp luôn là kiểu dữ liệu tham chiếu trong C# • Để tạo ra đối tượng ta sử dụng từ khóa new kết hợp với hàm tạo. • Có hai cách để tạo đối tượng: Cách 1: 31.Sinhvien sv; 32.sv = new Sinhvien(); Cách 2: 33.Sinhvien sv = new Sinhvien(); 1.3. ĐỐI TƯỢNG 18 • Hàm tạo (Constructor) hay còn gọi là bộ khởi dựng được mô tả trong mỗi lớp dùng để tạo và khởi tạo các trạng thái ban đầu của đối tượng. Nó được gọi một lần duy nhất khi khởi tạo đối tượng. • Trước khi bộ khởi dựng được thực hiện thì đối tượng chưa được cấp phát trong bộ nhớ. Sau khi bộ khởi dựng thực hiện hoàn thành thì bộ nhớ sẽ lưu giữ một đối tượng hợp lệ của lớp vừa khai báo. • Ví dụ: 34. public Sinhvien() { 35. tensv = “Nguyen X"; 36. diemtb = 8; 37. } 38. public Sinhvien(String m, int y) { 39. tensv = “Nguyen X”; 40. diemtb = 8; 41. } 1.4. HÀM TẠO 19 1.4. HÀM TẠO Đặc điểm của hàm tạo • Có các loại hàm tạo: mặc định, không tham số, có tham số, tĩnh và sao chép • Tên hàm tạo giống như tên lớp. • Không có giá trị trả về. • Khai báo là public, nếu khai báo private thì không cho phép tạo đối tượng 42.sinhvien() 43.{//Khởi tạo các biến thành viên của lớp trong hàm tạo 44.Tensv = “ưkefljwe”; 45.Sohieusv = 1234; 46... 47.} 48.sinhvien(); // phương thức không tham số 49.sinhvien(var1, var2);//phương thức khởi tạo có tham số 50.sinhvien SV2 = new sinhvien( SV1 ); 51. /*thực hiện việc tạo một đối tượng SV2 mới bằng cách sao chép tất cả các biến từ một đối tượng SV1đã có và cùng một kiểu dữ liệu*/ 20 1.4. HÀM TẠO Sử dụng đối tượng • Sau khi khai báo một đối tượng thuộc lớp sinhvien thì thông qua đối tượng này, ta có thể truy xuất vào các thành phần phương thức và thuộc tính của đối tượng vừa được tạo • Ví dụ: muốn thực hiện phương thức nhap() của đối tượng thuộc lớp sinhvien ta khai báo và sử dụng thông qua đối tượng tham chiếu SV1. 52.Sinhvien SV1 = new Sinhvien(); 53.SV1.nhap(); 54.SV1.ten=“Nguyễn Thị Na”; 55.SV1.diemtoan = 8; 56.SV1.diemly = 7; 57.SV1.diemhoa =10; 58.Diemtong = SV1.tinhtong(); 21 • Cú pháp khai báo hàm hủy trong ngôn ngữ C# như sau: ~Class1() {} • Thực hiện nhiệm vụ xoá đối tượng. 59.class sinhvien 60.{ 61. //... 62. ~sinhvien(); 63. { 64. // 65. } 66.} 1.5. HÀM HỦY - DESTRUCTOR Đặc điểm của hàm huỷ • Tên hàm huỷ trùng với tên lớp và có tiền tố là một dấu sóng(~); • Không có kiểu trả về; • Không có tham số truyền; • Không có bổ từ; • Hàm huỷ được gọi tự động khi đối tượng bị thu gom rác; • Một lớp chỉ có một hàm huỷ. 22 • Lớp  Là đặc tả chi tiết về đối tượng (còn gọi là bản mẫu -blueprint)  Một lớp có thể cho phép tạo ra nhiều đối tượng. • Đối tượng  Là thể hiện của một lớp với những đặc điểm, chức năng cụ thể;  Các đối tượng từ cùng một lớp sẽ có cùng cấu trúc và chức năng như mô tả trong lớp. 1.6. PHÂN BIỆT ĐỐI TƯỢNG VÀ LỚP 23 1.6. PHÂN BIỆT ĐỐI TƯỢNG VÀ LỚP Mối tương quan giữa đối tượng thực tế và đối tượng phần mềm Thực tế Phần mềmKhái niệm Lớp Đối tượng Thuộc tính Phương thức 67. public class Car { 68. private int price; 69. private String color; 70. } Car myCar=new Car(); Car yourCar=new Car(); Nguyễn XTên: 12345SohieuSV: Sinhvien 71. SV.nhap(); 72. SV.inthongtin(); 73. tinhtb(); Là bản mẫu, mô tả đối tượng Là thể hiện của một lớp với những đặc điểm, chức năng cụ thể. Dữ liệu của lớp Thể hiện hành vi của lớp 24 Các thành phần của lớp và đối tượng • Lớp đối tượng • Con trỏ this • Phương thức • Nạp chồng phương thức • Phương thức ảo • Sử dụng property 1.6. PHÂN BIỆT ĐỐI TƯỢNG VÀ LỚP (tiếp theo) 1.6. PHÂN BIỆT ĐỐI TƯỢNG VÀ LỚP (tiếp theo) 25 Lớp đối tượng • Nếu khi khai báo một lớp mà không chỉ rõ lớp có thừa kế từ một lớp khác thì trình biên dịch sẽ tự động hiểu rằng lớp đó thừa kế từ lớp Object. • Một số phương thức được định nghĩa trong lớp Object là:  ToString()  GetHashTable()  Equals(object objA, object objB)  ReferenceEquals(object objA, object objB)  GetType()  MemberwiseClone()  Finalize() 1.6. PHÂN BIỆT ĐỐI TƯỢNG VÀ LỚP (tiếp theo) 26 Con trỏ “this” • “this” được dùng để tham chiếu đến thể hiện hiện hành của một đối tượng. “this” này được xem là con trỏ ẩn đến tất các phương thức không có thuộc tính tĩnh trong một lớp. Mỗi phương thức có thể tham chiếu đến những phương thức khác và các biến thành viên thông qua “this”. • “this” được sử dụng trong ba trường hợp:  Sử dụng khi các biến thành viên bị che lấp bởi tham số đưa vào: 74. public void tinhtb( int diemtb) 75. { 76. this.diemtb = diemtb; 77. }  Sử dụng this để truyền đối tượng hiện hành vào một tham số của một phương thức của đối tượng khác. 78. public void tinhtb( OtherClass otherObject ) 79. { 80. // Sử dụng this để truyền tham số là bản thân đối tượng đang thực hiện 81. otherObject.SetObject( this ); 82. }  Sử dụng tham chiếu this là mảng chỉ mục (indexer). 27 • Là hàm hay thủ tục khai báo trong lớp • Hành vi giao tiếp với bên ngoài: Static và non static 83. public class sinhvien 84. { 85. public sinhvien ( ) { . . .} 86. public static void StaticMethod( ) { . . .} 87. public void NonStaticMethod( ) { . . .} 88. } 89. public class Tester() { 90. sinhvien sv = new sinhvien( ); 91. sv.NonStaticMethod( ); 92. sinhvien.StaticMethod( ); 93. } Truy cập qua thể hiện: sv Truy cập qua tên lớp: sinhvien 1.7. PHƯƠNG THỨC 1.7. PHƯƠNG THỨC 28 Khai báo phương thức 94.namespace QuanLySV 95.{ 96. class sinhvien 97. { 98. //... 105. } 106.} public static double tinhdiemtb( double diem1, double diem2) { } double kq = (diem1+diem2)/2; return kq; Phần khai báo Các câu lệnh Kiểu trả về Tên Đối số1 Câu lệnh trả kết quả ra ngoài Đối số2 99. 100. 101. 102. 103. 104. 29 1.7. PHƯƠNG THỨC Nạp chồng phương thức • Ngôn ngữ C# cho phép trong một lớp có thể xây dựng nhiều phương thức cùng tên, cùng giá trị trả về nhưng nhận các tham số khác nhau. Chức năng này được gọi là nạp chồng phương thức. • Một lớp không thể có hai phương thức giống nhau cả tên và tham số. 107.void tinhtong( int diemtoan ); 108.void tinhtong( int diemtoan, int diemly ); 109.void tinhtong( int diemtoan, int diemly , int diemhoa); 30 Phương thức ảo • Phương thức ảo:  Khai báo từ khoá virtual  Cho phép lớp con có thể thay thế • Đây chính là thực thi tính đa hình  Một phương thức của lớp cơ sở (lớp cha) có thể được thực thi khác nhau ở lớp dẫn xuất (lớp con)  Lớp sinhvien1 phủ quyết lại cách tính điểm trung bình của lớp sinhvien 110. class sinhvien 111.{ 112. //... 113. public virtual float TinhDiemTrungBinh() 114. { 115. float kq = (diemtoan + diemly) / 2; 116. return kq; 117. } 118.} 119.class sinhvien1:sinhvien 120.{ 121. //... 122. public override double TinhDiemTrungBinh() 123. { 124. double kq = (diemtoan * 2 + diemtoan) / 3; 125. return kq; 126. } 127.} 1.7. PHƯƠNG THỨC (tiếp theo) 31 1.7. PHƯƠNG THỨC (tiếp theo) Đó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/set để thay thế cho cách dùng truyền thống Geter/seter. • Property có khác biệt so với phương thức thành viên:  Không có tham số  Không có cặp ngoặc  Thân có hai từ khoá “get” để lấy và “set” để đặt giá trị cho property.  Trong thân “set” có biến mặc định là “value” mang kiểu khai báo là property và value nhận giá trị gán cho property. 32 1.7. PHƯƠNG THỨC (tiếp theo) Cài đặt property 128.class sinhvien 129.{ 130. protected double diemthi=0; 131. // 132. public double diemthi { 133. get { 134. return diemthi; 135. } 136. set { 137. if (0 <= value && value <= 10) 138. diemthi = value; 139. } 140. } 141.} 33 1.7. PHƯƠNG THỨC (tiếp theo) Sử dụng property 142.class Tester 143.{ 144. sinhvien sv1 = new sinhvien(“Nguyen Thi A”); 145. sv1.diemthi = 8; 146. sinhvien sv2 = new sinhvien(“Nguyen Van B”); 147. sv2.diemthi = sv1.diemthi; 148.} set get 34 TÓM LƯỢC CUỐI BÀI • Nắm được những khái niệm cơ bản trong lập trình hướng đối tượng. • Nắm được đặc trưng của công nghệ C# • Viết ứng dụng theo hướng đối tượng với C#  Xây dựng lớp.  Tạo và sử dụng đối tượng.  Các phương thức trong lớp  Sử dụng property đóng gói dữ liệu.