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
34 trang |
Chia sẻ: thanhle95 | Lượt xem: 728 | 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 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.