Xem mẫu

  1. BÀI 5 KẾ THỪA, ĐA NHIỆM TRONG C# GV. Chử Đức Hoàng 1 v1.0011106202
  2. 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
  3. MỤC TIÊU Trình bày được các khái niệm về kế thừa trong C# Trình bày được khái niệm về luồng và đa nhiệm trong C# Xây dựng một chương trình C# đơn giản sử dụng tính kế thừa Xây dựng một chương trình C# sử dụng tính đa nhiệm. 3 v1.0011106202
  4. NỘI DUNG 1 1.1.1. Giới thiệu chung 2 1.1.2. Đơn kế thừa 3 1.1.3. Đa kế thừa 4 1.1.4. Tính đa hình 5 2.2.1. Khái niệm luồng 6 2.2.2. Tạo luồng 7 2.2.3. Ứng dụng đa nhiệm 4 v1.0011106202
  5. 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
  6. 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: class : name s age id 6 v1.0011106202
  7. 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
  8. 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
  9. 1.1.2. ĐƠN KẾ THỪA (tiếp theo) Cấp phát bộ nhớ Khi tạo một đối tượng ở lớp thừa kế thì nó sẽ cấp phát bộ nhớ cho tất cả các trường của cả lớp cơ sở và lớp dẫn xuất. 33. class Person 44. Public static void 34. { Main() 35. string name; 45. { 36. int age; 46. Student s = new Student(); 37. ... 47. } 38. } 39. class Student : Person 40. { 41. int id; name 42. ... s age 43. } id 9 v1.0011106202
  10. 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
  11. 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
  12. 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 1. class Person 1. class Student : Person 2. { 2. { 3. public Person() { ... } 3. int id; 4. public Person(string name) 4. public Student(string name, int age, int id) { ... } 5. :base( name, age) 5. public Person(string name, 6. { int age) { ... } 7. this.id = id; 6. ... 8. } 7. } 9. } • 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
  13. 1.1.2. ĐƠN KẾ THỪA (tiếp theo) Gọi phương thức lớp cơ sở • Khi lớp kế thừa muốn định nghĩa lại phương thức đã được định nghĩa trong lớp cơ sở thì phải thực hiện theo cấu trúc: new ; • 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.; 13 v1.0011106202
  14. 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
  15. 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. } Chỉ cho phép đa kế thừa giao diện 1. class Graduate : IStudent, Iemployee,… 2. { 3. ... 4. } 15 v1.0011106202
  16. 1.1.3. ĐA KẾ THỪA (tiếp theo) Phân cấp kế thừa 1. class Person 61. Public static void Main() 2. { 62. { 3. string name; 63. Graduate g = new Graduate(); 4. int age; 64. } 5. ... 6. } 7. class Student : name Person age g 8. { id 9. int id; advisor 10. ... 11. } Khi tạo một đối tượng lớp kế thừa thì thứ 12. class Graduate : Student tự khởi tạo sẽ bắt đầu từ lớp cơ sở rồi sau 13. { đó mới khởi tạo đến lớp dẫn xuất. 14. string advisor; 15. ... 16. } 16 v1.0011106202
  17. CÂU HỎI THẢO LUẬN 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
  18. 1.1.4. ĐA HÌNH Lớp lồng nhau • Lớp đựơc khai báo bên trong thân của lớp khác gọi là lớp nội: inner class hay nested class, lớp kia gọi là lớp ngoài outer class. • Lớp nội có thể truy cập tất cả thành viên của lớp ngoài, kể cả private. • Lớp nội nằm trong lớp ngoài nên nó có thể là private với lớp ngoài. • Khi lớp nội khai báo là public thì có thể truy xuất thông qua tên của lớp ngoài: outer_class.inner_class. 18 v1.0011106202
  19. 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
  20. 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); } } Truy xuất lớp inner qua lớp outer, lớp outer tương tự như manespace 20 v1.0011106202
nguon tai.lieu . vn