Đặ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.
37 trang |
Chia sẻ: thanhle95 | Lượt xem: 538 | Lượt tải: 1
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