Bài giảng Ngôn ngữ C# - Bài 4: Lớp trừu tượng và giao diện trong C# - Chử Đức Hoàng

Đặc điểm của giao diện • Chỉ có thể chứa những khai báo của phương thức, thuộc tính, bộ phận lập mục lục, và sự kiện; • Không có Constructor hay các trường; • Không cho phép chứa các phương thức nạp chồng; • Không cho phép khai báo những bổ từ trên các thành phần khi định nghĩa một giao diện; • Các thành phần bên trong giao diện luôn luôn là public và không thể khai báo virtual hay static.

pdf37 trang | Chia sẻ: thanhle95 | Lượt xem: 527 | 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 4: Lớp trừu tượng và giao diện 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
v1.0011106202 1 BÀI 4 LỚP TRỪU TƯỢNG VÀ GIAO DIỆN TRONG C# GV. Chử Đức Hoàng v1.0011106202 2 TÌNH HUỐNG DẪN NHẬP • Các thành phần dữ liệu và cách thức thực hiện, thao tác trên các dữ liệu để thực hiện công việc quản lý học viên của trường đại học quốc gia cần được thực hiện theo cách nào đó để khi viết các chương trình, tổ chức các lớp, đối tượng cũng như việc dùng lại các thành phần dữ liệu và phương thức được thuận lợi. • Có những thành phần dữ liệu và phương thức chỉ thực hiện trong chương trình mà người ta không muốn lớp khác kế thừa lại. • Khi lớp muốn kế thừa một lớp do đơn vị thứ ba cung cấp thì nó tiến hành kế thừa, hơn nữa chương trình lại dùng lại các thành phầncủa một lớp do chương trình cung cấp.  Vậy những thông tin và việc tiến hành thao tác quản lý các học viênđược thực hiện quản lý và cất dấu như thế nào bằng C# ? v1.0011106202 3 MỤC TIÊU Trình bày khái niệm lớp trừu tượng? Mô tả sự khác nhau giữa lớp trừu tượng và một lớp cụ thể? Trình bày khái niệm giao diện, cách xây dựng và thực thi một giao diện. Kế thừa giao diện Xây dựng ví dụ minh hoạ v1.0011106202 4 NỘI DUNG Giới thiệu về lớp trừu tượng1 Giao diện và thực thi giao diện trong C#2 v1.0011106202 5 1.1. LỚP TRỪU TƯỢNG • Lớp trừu tượng là gì? • Các giới hạn của lớp trừu tượng? • Lớp sealed là gì và hoạt động của nó? v1.0011106202 6 1.1.1. KHÁI NIỆM • Lớp trừu tượng là lớp chỉ thiết lập một cơ sở cho các lớp kế thừa mà nó không thể có bất kỳ một thể hiện nào tồn tại. • Khai báo lớp trừu tượng bằng từ khoá abstract: abstract class v1.0011106202 7 1.1.2. CÁC GIỚI HẠN • Lớp trừu tượng không cho phép tạo thể hiện của lớp • Bất cứ lớp nào có một phương thức trừu tượng thì phải khai báo lớp là lớp trừu tượng • Override chúng trong lớp dẫn xuất • Các phương thức trừu tượng của lớp trừu tượng không được thực thi trong thân lớp mà phải được thực thi ở tất cả các lớp kế thừa từ lớp trừu tượng đó. • Phương thức trong lớp trừu tượng Abstract Method Virtual Method Từ khoá: abstract Từ khoá: virtual Chỉ có phần khai báo method và kết thúc là dấu “;”, Không cần có phần thực thi cho phương thức abstract ở lớp abstract Có phần thực thi cho phương thức virtual ở lớp cơ sở Bắt buộc lớp dẫn xuất phải override lại Không bắt buộc lớp dẫn xuất phải override Từ khoá override trước phương thức ở lớp con Từ khoá override trước phương thức ở lớp con v1.0011106202 8 Ví dụ • Lớp trừu tượng: AbstractClass • public abstract class AbstractClass • { • public AbstractClass() • { • } • public abstract int AbstractMethod() ; • public virtual int VirtualMethod() • { • return 0; • } • } Phương thức trừu tượng Lớp trừu tượng 1.1.2. CÁC GIỚI HẠN (tiếp theo) v1.0011106202 9 Lớp dẫn xuất từ lớp trừu tượng 13. public class DerivedClass : AbstractClass 14. { 15. public DerivedClass() 16. { } 17. public override int AbstractMethod() 18. { 19. return 0; 20. } 21. public override int VirtualMethod() 22. { 23. return base.VirtualMethod (); 24. } 25. } 1.1.2. CÁC GIỚI HẠN (tiếp theo) Bắt buộc phải có v1.0011106202 10 • Còn gọi là lớp niêm phong, không cho phép lớp khác kế thừa nó, ngược với lớp abstract. • Sử dụng từ khoá “sealed” thay cho từ khoá “abstract” để có được lớp sealed: sealed class • Sử dụng từ khoá “sealed” trước phương thức để ngăn không cho lớp dẫn xuất override. 1.1.3. LỚP SEALED v1.0011106202 11 Ví dụ minh hoạ lớp sealed 26.using System; 27.sealed class MyClass 28.{ 29. public int x; 30. public int y; 31.} 32.class MainClass { 33. public static void Main() 34. { 35. MyClass mC = new MyClass(); 36. mC.x = 110; mC.y = 150; 37. Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y); 38. } 39. } 1.1.3. LỚP SEALED (tiếp theo) v1.0011106202 12 40.using System; 41.class MyClass1 { 42. public int x; public int y; 43. public virtual void Method() { 44. Console.WriteLine("virtual method"); 45. } 46. } 47.class MyClass : MyClass1 { 48. public override sealed void Method() { 49. Console.WriteLine("sealed method"); 50. } 51. } 52.class MainClass { 53. public static void Main() { 54. MyClass1 mC = new MyClass(); 55. mC.x = 110; mC.y = 150; 56. Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y); 57. mC.Method(); 58. } 59. } Sử dụng sealed trước phương thức để ngăn ko cho lớp dẫn xuất override Phương thức sealed 1.1.3. LỚP SEALED (tiếp theo) PROPERTIES On passing, 'Finish' button: Goes to Next Slide On failing, 'Finish' button: Goes to Next Slide Allow user to leave quiz: At any time User may view slides after quiz: At any time User may attempt quiz: Unlimited times v1.0011106202 14 • 2.2.1. Định nghĩa và thực thi các giao diện; • 2.2.2. Kế thừa các giao diện. 2.2. GIAO DIỆN v1.0011106202 15 • Giao diện (interface) định nghĩa những khả năng muốn có trong một lớp; • Giao diện quy định các chức năng nhưng không mô tả cụ thể chúng. 2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN • Bổ từ truy cập: public, private, protected, internal, và protected internal, ý nghĩa tương tự như các bổ sung truy cập của lớp. • Sau từ khóa interface là tên của giao diện. Tên có tiền tố là “I”, ví dụ như: IFile, IComparable, IDisposable, IStorable, Icloneable, • Phần thân của giao diện là phần khai báo cho giao diện [Bổ từ truy cập] interface { //Phần thân giao diện } Định nghĩa giao diện • Cú pháp định nghĩa một giao diện: v1.0011106202 16 Đặc điểm của giao diện • Chỉ có thể chứa những khai báo của phương thức, thuộc tính, bộ phận lập mục lục, và sự kiện; • Không có Constructor hay các trường; • Không cho phép chứa các phương thức nạp chồng; • Không cho phép khai báo những bổ từ trên các thành phần khi định nghĩa một giao diện; • Các thành phần bên trong giao diện luôn luôn là public và không thể khai báo virtual hay static. 2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo) v1.0011106202 17 Ví dụ giao diện: 60. public interface IStudent 61. { 62. int StudentID 63. { 64. get; 65. set; 66. } 67. void AddSubject(string subjectName); 68. } Khai báo property StudentID gồm hàm get ,set Khai báo phương thức AddSubject Phải định nghĩa {get,set} của StudentID và AddSubject ở lớp thực thi interface 2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo) v1.0011106202 18 • Thực thi giao diện  Việc thực thi giao diện không sảy ra trong thân của nó mà nó chỉ thực thi trong lớp kế thừa từ nó.  Nếu không thực thi các phương thức của giao diện thì khi biên dịch sẽ bị báo lỗi. • Khai báo thực thi giao diện: class : { // Thực thi các phương thức của lớp //Thực thi các phương thức của giao diện IDSkhoakt } 2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo) v1.0011106202 19 Ví dụ: thực thi giao diện 69. public class Student : IStudent 70. { 71. private int studentID = 0; 72. private ArrayList subjects = null; 73. public Student() {} 74. public int StudentID 75. { 76. get { return studentID; } 77. set { studentID = value; } 78. } 79. public void AddSubject(string subjectName) 80. { 81. subjects.Add(subjectName); 82. } 83. } Bắt buộc lớp student phải định nghĩa property Student và hàm AddSubject 2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo) v1.0011106202 20 • Thực thi nhiều giao diện  C# cho phép một lớp thực thi nhiều hơn một giao diện. • Ví dụ: Giữa các giao diện được ngăn cách bởi dấu “,” 84. public class QLSV : IDSkhoakt, IDSkhoatin 85. { 86. //Thực thi giao diện 87. } Trong lớp QLSV phải thực hiện tất cả các phương thức đã định nghĩa trong hai giao diện cơ sở trên 2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo) PROPERTIES On passing, 'Finish' button: Goes to Next Slide On failing, 'Finish' button: Goes to Next Slide Allow user to leave quiz: At any time User may view slides after quiz: At any time User may attempt quiz: Unlimited times v1.0011106202 22 • Danh sách giao diện cơ sở là danh sách các giao diện mà giao diện này kế thừa; • Sự kế thừa interface phải đặt sau sự kế thừa lớp. [Bổ từ truy cập] interface [: danh sách giao diện cơ sở] { //Phần thân giao diện } • Định nghĩa: 2.2.2. KẾ THỪA GIAO DIỆN v1.0011106202 23 • Mở rộng giao diện  C# cho phép mở rộng một giao diện đã có để thêm các phương thức và các thành viên hay bổ sung cách làm việc cho các thành viên;  Cách thức: thêm phương thức ghi log các dữ liệu đã lưu. • Ví dụ: 88. interface ILoggedStudent : IStudent 89. { 90. void LogSavedBytes(); 91. }  Lớp có thể sử dụng giao diện cũ hoặc giao diện mở rộng tùy thuộc vào mục đích sử dụng.  Lớp mà thực thi giao diện mở rộng thì phải thực thi tất cả các phương thức của cả hai giao diện cũ và mới.  Những đối tượng của lớp thực thi giao diện mới có thể được gán cho cả hai giao diện cũ và mới. 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) v1.0011106202 24 • Kết hợp các giao diện  Có thể tạo giao diện mới bằng cách kết hợp các giao diện cũ và có thể thêm các phương thức hay các thuộc tính cho giao diện mới. • Ví dụ: 92. interface IStudent3 : IStudent1, IStudent2 93. { 94. //Phương thức mới 95. //Dữ liệu mới 96. } 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) v1.0011106202 25 Truy cập phương thức của giao diện 97. Student st = new Student(“Nguyễn thị Vân”); 98. st.StudentID = 123; 99. st.AddSubject(“Nguyễn văn X”); Gán đối tượng của lớp cho kiểu dữ liệu giao diện, và sử dụng giao diện này để truy cập Truy cập thành viên của giao diện như thành viên của lớp: 100. Istudent st1 = (Istudent) sv; 101. st1.StudentID = 123; 102. st1.AddSubject(“Nguyễn văn X”); 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) v1.0011106202 26 • Cách tốt nhất để truy cập đến thành phần giao diện là thông qua tham chiếu của giao diện. Cách khai báo kết hợp như sau: Istudent st1 (Istudent) new Student(“Nguyễn văn X”;) • Ví dụ: 103. interface Istudent1 104. { 105. int StudentID; 106. void AddSubject(); 107. } 108. interface Istudent2 109. { 110. int PointMath; 111. void AveragePoint(); 112. } 113. Public class Student:Istudent1{} 114. Student st = new Student("Nguyễn thị X"); 103. Istudent1 ist1 = (Istudent1) st; 104. ist1.AddSubject(); 105. Istudent2 ist2 = (Istudent2) st; 106. ist2.AveragePoint(); Lớp Student chỉ thực thi giao diện Istudent Tham chiếu ist1 đến đối tượng st của lớp Student là hợp lệ Tham chiếu ist2 đến đối tượng st của lớp Student là không hợp lệ 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) v1.0011106202 27 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) Sử dụng “is” kiểm tra sự thực thi giao diện của đối tượng 119. Student st = new Student("Nguyễn thị X"); 120. // chỉ gán khi an toàn 121. if ( st is Istudent1 ) 122. { 123. Istudent1 ist1 = (Istudent1) st; 124. ist1.AddSubject(); • } • // việc kiểm tra này sẽ sai 121. if ( st is Istudent2 ) • { • Istudent2 ist2 = (Istudent2) st; • ist2.AveragePoint(); • } Cấu trúc sử dụng is: is Nếu đúng thì is cho kết quả true, sai thì cho kết quả false v1.0011106202 28 132. Student st = new Student(“Nguyễn văn X”); 133. Istudent1 ist1 = st as Istudent1; 134. if ( ist1 != null ) 135. { 136. ist1.AddSubject(); 137. } 138. else 139. { 140. Console.WriteLine(“Istudent1 không được thực hiện trong lớp Student”); 141. } 142. Istudent2 ist2 = st as Istudent2; 143. if ( ist2 != null) 144. { 145. ist2.AveragePoint(); 146. } 147. else 148. { 149. Console.WriteLine(“Istudent2 không được thực hiện trong lớp Student”); 150. } Sử dụng “as”kiểm tra sự thực thi giao diện của đối tượng Cấu trúc sử dụng is: as Kiểm tra tính hợp lệ của phép gán, nếu hợp lệ thì phép gán được thực hiện, nếu không hợp lệ thì as trả về giá trị null 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) v1.0011106202 29 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) So sánh “is” và “as” is as Khai báo: is Khai báo: as Kết quả trả về: - Đúng: true - Sai: false Kết quả trả về - Đúng: thực hiện ngay phép gán - Sai: null Có phát sinh ngoại lệ và đôi khi gặp kiểm tra điều kiện nhiều lần. Không phát sinh ngoại lệ, loại bỏ được xử lý ngoại lệ. Kiểm tra và thực hiện phép gán đối tượng cho giao diện: - Không tối ưu Kiểm tra và thực hiện phép gán đối tượng cho giao diện: - Tối ưu Kiểm tra và không thực hiện phép gán: - Tối ưu Kiểm tra và không thực hiện phép gán: - Không tối ưu v1.0011106202 30 Giao diện và lớp trừu tượng 151. public class Student : Student1, IStudent1 152. { 153. // phương thức lớp Student1... 154. ..... 155. // Thực Thi Giao Diện IStudent1 156. } Giao diện rất giống các lớp trừu tượng nên có thể thay thế giao diện bằng lớp trừu tượng và sau đó dùng kế thừa để lớp thực hiện các phương thức. C# không cho phép đa kế thừa nhiều lớp mà cho kế thừa từ một lớp và các giao diện 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) v1.0011106202 31 Thực thi giao diện tường minh 157.interface Istudent1 158.{ 159. int StudentID; 160. void AddSubject(); 161. void PointIn(); 162.} 163.interface Istudent2 164.{ 165. int PointMath; 166. void AddSubject(); 167. void PointOut(); 168.} 169.public class Student : IStudent1, IStudent2 170.{ 171./* phương thức AddSubject giao diện IStudent1 và IStudent2 giống nhau nên phải thực thi tường minh*/ 172. void Istudent1.AddSubject(){} 173.//Các phương thức khác của giao diện không xung đột thì thực thi bình thường 174. public void PointIn(){} 175.// Thực Thi Giao Diện IStudent2 7 .} Không có bổ từ truy cập Có bổ từ truy cập Giống nhau trong hai giao diện 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) v1.0011106202 32 Gọi phương thức tường minh 177. static void Main() 178. { 179. // tạo đối tượng st 180. Student st = new Student("Nguyễn Văn X"); 181. IStudent1 ist1 = st as IStudent1; 182. if ( ist1 != null ) 183. { 184. ist1.AddSubject(); 185. } 186. IStudent2 ist2 = st as IStudent2; 187. if ( ist2 != null ) 188. { 189. ist2.AddSubject(); 190. } 191. st.PointIn(); 192. st.PointOut(); 193. } Gọi thông qua việc gán cho giao diện với phương thức thực thi tường minh Thực thi qua đối tượng 2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo) PROPERTIES On passing, 'Finish' button: Goes to Next Slide On failing, 'Finish' button: Goes to Next Slide Allow user to leave quiz: At any time User may view slides after quiz: At any time User may attempt quiz: Unlimited times v1.0011106202 34 TÓM LƯỢC CUỐI BÀI • Nắm được về khái niệm, khai báo lớp trừu tượng, các giới hạn cửa lớp trừu tượng từ đó đưa ra cách sử dụng lớp trừu tượng. • Nắm được lớp Sealed là gì? cách mà C# muốn đóng cũng như hoạt động của lớp Sealed. • Giao diện và cách thức làm việc của giao diện, cách thức. PROPERTIES On passing, 'Finish' button: Goes to Next Slide On failing, 'Finish' button: Goes to Next Slide Allow user to leave quiz: At any time User may view slides after quiz: At any time User may attempt quiz: Unlimited times PROPERTIES Allow user to leave interaction: Anytime Show ‘Next Slide’ Button: Don't show Completion Button Label: Next Slide PROPERTIES Allow user to leave interaction: Anytime Show ‘Next Slide’ Button: Don't show Completion Button Label: Next Slide