You are on page 1of 37

BÀI 4

LỚP TRỪU TƯỢNG VÀ


GIAO DIỆN TRONG C#

GV. Chử Đức Hoàng

1
v1.0011106202
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# ?

2
v1.0011106202
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ạ

3
v1.0011106202
NỘI DUNG

1 Giới thiệu về lớp trừu tượng

2 Giao diện và thực thi giao diện trong C#

4
v1.0011106202
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ó?

5
v1.0011106202
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:

<Bổ từ truy cập> abstract class <Tên lớp>

6
v1.0011106202
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à Có phần thực thi cho phương thức virtual ở
dấu “;”, Không cần có phần thực thi cho lớp cơ sở
phương thức abstract ở lớp abstract
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 ở Từ khoá override trước phương thức ở
lớp con lớp con

7
v1.0011106202
1.1.2. CÁC GIỚI HẠN (tiếp theo)

Lớp trừu tượng


Ví dụ

• Lớp trừu tượng: AbstractClass

• public abstract class AbstractClass


• {
Phương thức trừu tượng
• public AbstractClass()
• {
• }
• public abstract int AbstractMethod() ;
• public virtual int VirtualMethod()
• {
• return 0;
• }
• }

8
v1.0011106202
1.1.2. CÁC GIỚI HẠN (tiếp theo)

Lớp dẫn xuất từ lớp trừu tượng

Bắt buộc phải có


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. }

9
v1.0011106202
1.1.3. LỚP SEALED

• 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:
<Bổ từ truy cập> sealed class <Tên lớp>

• Sử dụng từ khoá “sealed” trước phương thức để ngăn không cho lớp dẫn xuất
override.

10
v1.0011106202
1.1.3. LỚP SEALED (tiếp theo)

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. }

11
v1.0011106202
1.1.3. LỚP SEALED (tiếp theo)

Phương thức sealed


Sử dụng sealed trước
40. using System; phương thức để ngăn ko
41. class MyClass1 { cho lớp dẫn xuất override
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. } 12
v1.0011106202
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
2.2. GIAO DIỆN

• 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.

14
v1.0011106202
2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN

• 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.
Định nghĩa giao diện
• Cú pháp định nghĩa một giao diện:

[Bổ từ truy cập] interface <Tên giao diện>


{
//Phần thân 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

15
v1.0011106202
2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo)

Đặ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.

16
v1.0011106202
2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo)

Ví dụ giao diện:

Khai báo property StudentID gồm


60. public interface IStudent hàm get ,set
61. {
62. int StudentID
63. {
64. get;
65. set; Khai báo phương thức AddSubject
66. }
67. void AddSubject(string subjectName);
68. }

Phải định nghĩa {get,set} của StudentID


và AddSubject ở lớp thực thi interface

17
v1.0011106202
2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo)

• 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:

<Bổ từ truy cập> class <Tên lớp> : <Tên giao diện>{


// 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
}

18
v1.0011106202
2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo)

Ví dụ: thực thi giao diện

69. public class Student : IStudent


70. {
Bắt buộc lớp student phải
71. private int studentID = 0;
định nghĩa property Student
72. private ArrayList subjects = null; và hàm AddSubject
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. }

19
v1.0011106202
2.2.1. ĐỊNH NGHĨA VÀ THỰC THI CÁC GIAO DIỆN (tiếp theo)

• 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ụ:

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 Giữa các giao diện được
phương thức đã định nghĩa trong ngăn cách bởi dấu “,”
hai giao diện cơ sở trên

20
v1.0011106202
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
2.2.2. KẾ THỪA GIAO DIỆN

• Định nghĩa:

[Bổ từ truy cập] interface <Tên giao diện> [: danh sách giao diện cơ sở]
{
//Phần thân giao diện
}

• 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.

22
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)

• 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.

23
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)

• 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. }

24
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)

Truy cập phương thức của giao diện

Truy cập thành viên


của giao diện như 97. Student st = new Student(“Nguyễn thị Vân”);
thành viên của lớp: 98. st.StudentID = 123;
99. st.AddSubject(“Nguyễn văn X”);

Gán đối tượng của


100. Istudent st1 = (Istudent) sv;
lớp cho kiểu dữ liệu
101. st1.StudentID = 123;
giao diện, và sử
102. st1.AddSubject(“Nguyễn văn X”);
dụng giao diện này
để truy cập

25
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)

• 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. { Lớp Student chỉ thực thi giao diện Istudent
105. int StudentID;
106. void AddSubject();
107. } Tham chiếu ist1 đến đối tượng st của lớp
108. interface Istudent2 Student là hợp lệ
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;
Tham chiếu ist2 đến đối tượng st của lớp
106. ist2.AveragePoint();
Student là không hợp lệ 26
v1.0011106202
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
Cấu trúc sử dụng is:
121. if ( st is Istudent1 )
122. { <tên biến> is <Tên giao diện>
123. Istudent1 ist1 = (Istudent1) st;
124. ist1.AddSubject(); Nếu đúng thì is cho kết quả true,
• } sai thì cho kết quả false
• // việc kiểm tra này sẽ sai
121. if ( st is Istudent2 )
• {
• Istudent2 ist2 = (Istudent2) st;
• ist2.AveragePoint();
• }

27
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)

Sử dụng “as”kiểm tra sự thực thi giao diện của đối tượng
132. Student st = new Student(“Nguyễn văn X”);
133. Istudent1 ist1 = st as Istudent1; Cấu trúc sử dụng is:
134. if ( ist1 != null )
<tên biến> as <Tên giao diện>
135. {
136. ist1.AddSubject(); Kiểm tra tính hợp lệ của phép gán, nếu hợp lệ
137. } thì phép gán được thực hiện, nếu không hợp
138. else lệ thì as trả về giá trị null
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. } 28
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)

So sánh “is” và “as”

is as

Khai báo: Khai báo:


<Tên biến> is <Tên giao diện> <Tên biến> as <Tên giao diện>
Kết quả trả về: Kết quả trả về
- Đúng: true - Đúng: thực hiện ngay phép gán
- Sai: false - Sai: null

Có phát sinh ngoại lệ và đôi khi gặp kiểm Không phát sinh ngoại lệ, loại bỏ được xử lý
tra điều kiện nhiều lần. ngoại lệ.

Kiểm tra và thực hiện phép gán đối tượng Kiểm tra và thực hiện phép gán đối tượng
cho giao diện: cho giao diện:
- Không tối ưu - Tối ưu

Kiểm tra và không thực hiện phép gán: Kiểm tra và không thực hiện phép gán:
- Tối ưu - Không tối ưu

29
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)

Giao diện và lớp trừu tượng

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

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. }
30
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)
Thực thi giao diện tường minh
157.interface Istudent1
158.{
159. int StudentID;
160. void AddSubject();
161. void PointIn(); Giống nhau trong hai giao diện
162.}
163.interface Istudent2
164.{
165. int PointMath;
Không có bổ từ truy cập
166. void AddSubject();
167. void PointOut(); Có bổ từ truy cập
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
176.} 31
v1.0011106202
2.2.2. KẾ THỪA GIAO DIỆN (tiếp theo)

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 ) Gọi thông qua việc gán cho giao diện với
183. { phương thức thực thi tường minh
184. ist1.AddSubject();
185. }

186. IStudent2 ist2 = st as IStudent2;


187. if ( ist2 != null )
188. {
189. ist2.AddSubject();
Thực thi qua đối tượng
190. }
191. st.PointIn();
192. st.PointOut();
193. } 32
v1.0011106202
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
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.

34
v1.0011106202
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

You might also like