Professional Documents
Culture Documents
SE203 - Bai 5 - v1.0011108202
SE203 - Bai 5 - v1.0011108202
SE203 - Bai 5 - v1.0011108202
1
v1.0011106202
TÌNH HUỐNG DẪN NHẬP
• Khi thực hiện viết chương trình để quản lý học viên, của trường đại học Quốc gia
bằng ngôn ngữ lập trình C# thì các vấn đề như: tránh trùng lặp khi phải viết lại
nhiều đoạn chương trình giống nhau trong các lớp, khả năng tái sử dụng lại chương
trình trong các lớp là vấn đề rất được quan tâm.
• Trong chương trình quản lý học viên có nhiều luồng công việc khác nhau. Việc quản
lý thực thi các luồng công việc thực hiện bởi ngôn ngữ lập trình để thực hiện các
phần công việc khác nhau mà người dùng yêu cầu.
• Ngôn ngữ C# có cho phép kế thừa không và việc kế thừa được thực
•
hiện như thế nào?
Các luồng công việc được thực hiện như thế nào cũng như cách xử
lý khi có sự xung đột xảy ra giữa các luồng trong C#?
2
v1.0011106202
MỤC TIÊU
Xây dựng một chương trình C# đơn giản sử dụng tính kế thừa
3
v1.0011106202
NỘI DUNG
3 1.1.3. Đa kế thừa
4
v1.0011106202
1.1.1. GIỚI THIỆU CHUNG
• Thừa kế là cách tạo một lớp mới từ các lớp có sẵn. Nó cho phép tái sử dụng lại mã
nguồn đã viết trong lớp có sẵn.
• Lớp và các thể hiện của lớp (tức đối tượng) tuy không tồn tại trong cùng một khối,
nhưng chúng tồn tại trong một mạng lưới sự phụ thuộc và quan hệ lẫn nhau.
• Ví dụ như: sinh viên và công nhân đều là con người có tên, có tuổi,…
• Quan hệ “là -một” (is-a) là một sự đặc biệt hóa.
• Quan hệ đặc biệt hóa và tổng quát hóa là hai mối quan hệ đối ngẫu và phân cấp
với nhau bởi vì chúng ta tạo ra một cây quan hệ.
Đặc biệt hoá là những nhánh của tổng quát hoá.
Nếu di chuyển lên trên cùng thì được trường hợp tổng quát hóa.
Nếu di chuyển xuống thì được trường hợp đặc biệt hóa.
5
v1.0011106202
1.1.2. ĐƠN KẾ THỪA
• Kế thừa là việc một lớp có thể thừa hưởng những thuộc tính và phương thức từ một
lớp khác.
• Cú pháp:
<Bổ từ truy cập> class <Tên lớp kế thừa>:<Tên lớp cơ sở>
name
s age
id
6
v1.0011106202
1.1.2. ĐƠN KẾ THỪA (tiếp theo)
Đặc điểm
• Lớp dẫn xuất sẽ kế thừa tất cả các thành viên của lớp cơ sở, bao gồm tất cả các
phương thức và biến thành viên của lớp cơ sở.
• Lớp dẫn xuất được tự do thực thi các phiên bản của một phương thức của lớp cơ sở.
• Lớp dẫn xuất cũng có thể tạo một phương thức mới và thuộc tính mới.
• C# chỉ cho phép đơn thừa kế giữa các lớp.
• Trong C# một lớp bắt buộc phải thừa kế từ một lớp nào đó.
7
v1.0011106202
1.1.2. ĐƠN KẾ THỪA (tiếp theo)
Lặp lại giống nhau
Ví dụ:
1. class Student 17. class Person
2. { 18. {
3. string name; 19. string name;
4. int age; 20. int age;
5. public void Birthday() { age++; } 21. public void Birthday() { age++; }
6. int id; 22. }
7. public double Calpoint(); 23. class Student : Person
8. } 24. {
9. class Employee 25. int id;
10. { 26. public double Calpoint();
11. string name; 27. }
12. int age; 28. class Employee : Person
13. public void Birthday() { age++; } 29. {
14. double salary; 30. double salary;
15. public double Calsalary(); 31. public double Calsalary();
16. } 32. }
8
v1.0011106202
1.1.2. ĐƠN KẾ THỪA (tiếp theo)
9
v1.0011106202
1.1.2. ĐƠN KẾ THỪA (tiếp theo)
Thực thi phương thức lớp cơ sở
49. class Person
61. Public static void Main()
50. {
62. {
51. public void Birthday()
63. Student s = new Student();
52. {
64. s.Birthday();
53. age++;
65. }
54. }
55. ...
56. }
57. class Student : Person Gọi phương thức lớp cơ sở từ
58. { đối tượng của lớp kế thừa
59. ...
60. }
• Có thể gọi phương thức lớp cơ sở từ phương thức lớp dẫn xuất bằng từ
khoá “base”
• Có thể ẩn các phương thức lớp cơ sở bằng cách sử dụng từ khoá “new” 10
v1.0011106202
1.1.2. ĐƠN KẾ THỪA (tiếp theo)
Gọi phương thức khởi dựng lớp cơ sở
33. class Person
34. {
35. string name; Không kế thừa phương thức
36. int age; khởi dựng.
37. public Person(string name, int age)
38. {
39. this.name = “Nguyễn văn X”; Cách gọi được thực hiện bằng việc
40. this.age = 23; đặt dấu hai chấm ngay sau phần
41. }
42. ... khai báo danh sách tham số và
43. } tham chiếu đến lớp cơ sở thông qua
44. class Student : Person từ khóa base
45. {
46. //gọi hàm tạo lớp cơ sở
47. public Student( string name, int age, int pointin):base(name, age)
48. int id;
49. ...
50. }
Có thể gọi hàm tạo lớp cơ sở từ hàm tạo lớp
dẫn xuất
11
v1.0011106202
1.1.2. ĐƠN KẾ THỪA (tiếp theo)
Chọn hàm tạo lớp cơ sở
Khi lớp cơ sở “Person” có nhiều Ở lớp kế thừa gọi đến hàm tạo
hàm tạo: thứ 3
• Khi lớp kế thừa không gọi đích danh hàm tạo nào của lớp cơ sở thì trình biên dịch
sẽ tự động gọi hàm tạo không đối số của lớp cơ sở.
• Nếu lớp cơ sở chỉ định nghĩa hàm tạo có đối số mà lớp dẫn xuất không gọi hàm tạo
này thì sẽ báo lỗi biên dịch.
12
v1.0011106202
1.1.2. ĐƠN KẾ THỪA (tiếp theo)
• Sau khi phương thức được định nghĩa lại trong lớp kế thừa, thì nó sẽ làm ẩn đi
phương thức của lớp cơ sở và thay thế bằng phương thức mới được định nghĩa lại.
• Nếu muốn gọi phương thức của lớp cơ sở thì phải dùng từ khoá “base”:
base.<Tên phương thức()>;
13
v1.0011106202
1.1.2. ĐƠN KẾ THỪA (tiếp theo)
1. class Person
2. {
3. int id;
4. public void SetId(int id) { this.id = id; }
5. public void Print()
6. {Console.WriteLine(name);
7. Console.WriteLine(age);}
8. }
Định nghĩa lại phương thức lớp
cơ sở thông qua từ khoá “new”
9. class Student : Person
10. {
11. int id;
12. public new void SetId(int id) { this.id = id; }
13. public new void Print()
14. {
Gọi phương thức lớp cơ sở thông
15. base.Print();
16. Console.WriteLine(id); qua từ khoá “base”
17. }
18. }
14
v1.0011106202
1.1.3. ĐA KẾ THỪA
Chỉ cho phép đơn kế thừa: Không cho phép đa kế thừa, nếu thực
1. class Student : Person hiện đa kế thừa lớp thì sẽ báo lỗi:
2. { 1. class Graduate : Student,
3. ... Employee
4. } 2. {
5. class Employee : Person 3. ...
6. { 4. }
7. ...
8. }
15
v1.0011106202
1.1.3. ĐA KẾ THỪA (tiếp theo)
Phân cấp kế thừa
So sánh hai từ khai báo mới đó là kiểu "new" và "override" giống và khác
nhau gì?
17
v1.0011106202
1.1.4. ĐA HÌNH
18
v1.0011106202
1.1.4. ĐA HÌNH (tiếp theo)
Ví dụ:
public class Student Truy xuất được thành phần
{ Private của lớp outer
private int mathpoint;
private int phypoint;
public Student(int mathpoint, int phypoint) {
this.mathpoint = mathpoint;
this.phypoint = phypoint;
} Lớp nested class
public override string ToString() {
string str = mathpoint.ToString() + "/" + phypoint.ToString();
return s;
}
public class StudentDisplay
{
public void Display(Student f) {
Console.WriteLine(“Display Math Point {0}", f.mathpoint);
Console.WriteLine("Display Physical Point {0}", f.phypoint);
}
}
} 19
v1.0011106202
1.1.4. ĐA HÌNH (tiếp theo)
Ví dụ:
class Tester
{
static void Main()
{
Student f1 = new Student(3, 4);
Console.WriteLine("f1: {0}", f1.ToString());
Student.StudentDisplay fa = new Student.StudentDisplay();
fa.Display(f1);
}
}
20
v1.0011106202
2.2.1. KHÁI NIỆM LUỒNG
• Luồng (thread): Là một chuỗi liên tiếp các lệnh mà máy tính thực thi.
• Trong một chương trình C# , việc thực thi bắt đầu bằng phương thức Main() và tiếp
tục cho đến khi kết thúc hàm Main(). Do vậy, phương thức Main() là phương thức
mà .NET runtime lấy để bắt đầu cho các luồng.
• Trong một chương trình thường muốn làm nhiều nhiệm vụ khác nhau cùng một lúc.
• Lớp luồng
Mỗi luồng Win32 được thông qua một hàm để chạy khi nó được tạo ra. Khi một
luồng quay trở lại từ hàm thì nó chấm dứt.
Trong C#, các luồng được thao tác bằng cách dùng lớp Thread nằm trong
namespace “System.Threading”.
Một thể hiện của luồng đaị diện cho một luồng.
Có thể tạo các luồng khác bằng cách khởi tạo một đối tượng luồng.
21
v1.0011106202
2.2.2. TẠO LUỒNG
• Tạo luồng:
Thread thread = new Thread(new ThreadStart(ThreadFunc));
thread.Start();
ThreadStart(SomeClass.aStaticFunction);
ThreadStart(someClassInstance.aNonStaticFunction);
• Các trạng thái của luồng
Start(): cho chạy luồng.
Suspend(): Đình chỉ tạm thời luồng để bắt đầu một luồng khác.
Resume(): Gọi phục hồi luồng.
Sleep(): cho luồng ngủ một khoảng thời gian.
Abort(): huỷ luồng.
22
v1.0011106202
2.2.2. TẠO LUỒNG (tiếp theo)
23
v1.0011106202
2.2.3. ỨNG DỤNG ĐA NHIỆM
• Một ứng dụng cần thực hiện nhiều hơn một công việc nên cần thực thi nhiều luồng
công việc thì được gọi là ứng dụng đa nhiệm. Khi đó thì phải đăng kí các độ ưu tiên
khác nhau cho các luồng khác nhau trong một tiến trình. Luồng có độ ưu tiên cao
hơn thì nó sẽ chiếm quyền ưu tiên so với các luồng khác trong tiến trình.
• Cần thận trọng khi cấp quyền ưu tiên cho các luồng.
• Một luồng không được không được phép hoạt động nếu có một luồng có độ ưu tiên
cao hơn đang làm việc.
• Luồng hệ thống thường có quyền ưu tiên cao hơn. Ví dụ trong Windows có khuynh
hướng đặt độ ưu tiên cao cho các luồng của hệ điều hành.
• Các mức độ ưu tiên của luồng (ThreadPriority) là:
Highest
AboveNormal
Normal
BelowNormal
Lowest
24
v1.0011106202
2.2.3. ỨNG DỤNG ĐA NHIỆM (tiếp theo)
• Sự đồng bộ
• Sự đồng bộ là việc truy nhập một biến bởi nhiều luồng vào cùng thời điểm. Nếu
không đảm bảo được sự đồng bộ thì sẽ gây ra các lỗi.
• C# cung cấp một cách thức dễ dàng để giải quyết việc đồng bộ trong việc truy nhập
biến bằng từ khóa lock:
lock (x)
{
DoSomething();
}
• Câu lệnh lock sẽ bao một đối tượng gọi là mutual exclusion lock hay mutex. Trong
khi mutex bao một biến thì không một luồng nào được quyền truy nhập vào biến đó.
• Trong đoạn mã trên khi câu lệnh hợp thực thi và nếu time slice của luồng này kết
thúc và luồng kế tiếp thử truy xuất vào biến x , việc truy xuất đến biến sẽ bị từ chối.
thay vào đó window đơn giản đặt luồng đó ngủ cho đến khi mutex được giải phóng.
Mutex là một cơ chế đơn giản được dùng để điều khiển việc truy nhập vào các biến.
Tất cả việc điều khiển này nằm trong lớp System.Threading.Monitor. Câu lệnh lock
gồm một số phương thức gọi đến lớp này.
25
v1.0011106202
2.2.3. ỨNG DỤNG ĐA NHIỆM (tiếp theo)
26
v1.0011106202
CÂU HỎI THẢO LUẬN
Có mấy mức ứng dụng đa nhiệm? So sánh ưu tiên đa nhiệm của Windows
với các chương trình của hệ thống?
27
v1.0011106202
2.2.3. ỨNG DỤNG ĐA NHIỆM (tiếp theo)
Ví dụ “deadlock”
• Luồng 1: • Luồng 2:
1. lock (a) 1. lock (b)
2. {// do something 2. { // do something
3. lock (b) 3. lock (a)
4. { 4. {
5. // do something 5. // do something
6. } 6. }
7. } 7. }
Trong đó a, b là hai đối tượng tham Hai luồng cùng làm việc:
chiếu mà cả hai luồng cần truy cập. • Luồng 1: lock a, luồng 2 lock b
• Luồng 1: lock b thì rơi vào trạng
thái ngủ chờ luồng 2 giải phóng b
và ngược lại.
28
v1.0011106202
2.2.3. ỨNG DỤNG ĐA NHIỆM (tiếp theo)
29
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
• Mô tả cách thức xây dựng một lớp mới dựa trên lớp đã có và khai
thác cũng như phạm vi truy cập các thuộc tính và phương thức của
lớp nền và lớp dẫn xuất của ngôn ngữ C#.
• Lớp trừu tượng, lớp lồng và vấn đề override phương thức trong lớp
kế thừa của C#.
• Mô tả khái niệm luồng và cách tạo một luồng và các vấn đề phát sinh
khi thực hiện các luồng. Cách khắc phục lỗi sảy ra khi sử dụng đa
luồng trong ngôn ngữ C#.
• Xây dựng các modul trong chương trình quản lý học viên sử dụng tính
kế thừa trong C#.
• Xây dựng phần mềm có tạo luồng trong chương trình quản lý
học viên.
31
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