Bài giảng ngôn ngữ C# - Bài 5: Kế thừa, đa nhiệm trong C# trình bày các khái niệm về kế thừa trong C#; khái niệm về luồng và đa nhiệm trong C#; 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.
BÀI KẾ THỪA, ĐA NHIỆM TRONG C# GV Chử Đức Hồng v1.0011106202 TÌNH HUỐNG DẪN NHẬP • Khi thực viết chương trình để quản lý học viên, trường đại học Quốc gia ngôn ngữ lập trình C# vấn đề như: tránh trùng lặp phải viết lại nhiều đoạn chương trình giống lớp, khả tái sử dụng lại chương trình lớp vấn đề 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 Việc quản lý thực thi luồng công việc thực ngôn ngữ lập trình để thực phần cơng việc khác mà người dùng yêu cầu v1.0011106202 • • Ngơn ngữ C# có cho phép kế thừa khơng việc kế thừa thực nào? Các luồng công việc thực cách xử lý có xung đột xảy luồng C#? MỤC TIÊU Trình bày khái niệm kế thừa C# Trình bày khái niệm luồng đa nhiệm C# Xây dựng chương trình C# đơn giản sử dụng tính kế thừa Xây dựng chương trình C# sử dụng tính đa nhiệm v1.0011106202 NỘI DUNG v1.0011106202 1.1.1 Giới thiệu chung 1.1.2 Đơn kế thừa 1.1.3 Đa kế thừa 1.1.4 Tính đa hình 2.2.1 Khái niệm luồng 2.2.2 Tạo luồng 2.2.3 Ứng dụng đa nhiệm 1.1.1 GIỚI THIỆU CHUNG • Thừa kế cách tạo lớp từ lớp có sẵn Nó cho phép tái sử dụng lại mã nguồn viết lớp có sẵn • Lớp thể lớp (tức đối tượng) không tồn khối, chúng tồn mạng lưới phụ thuộc quan hệ lẫn • Ví dụ như: sinh viên cơng nhân người có tên, có tuổi,… • Quan hệ “là -một” (is-a) đặc biệt hóa • Quan hệ đặc biệt hóa tổng quát hóa hai mối quan hệ đối ngẫu phân cấp với tạo quan hệ Đặc biệt hoá nhánh tổng quát hoá Nếu di chuyển lên trường hợp tổng quát hóa Nếu di chuyển xuống trường hợp đặc biệt hóa v1.0011106202 1.1.2 ĐƠN KẾ THỪA • Kế thừa việc lớp thừa hưởng thuộc tính phương thức từ lớp khác • Cú pháp: class : s v1.0011106202 name age id 1.1.2 ĐƠN KẾ THỪA (tiếp theo) Đặc điểm • Lớp dẫn xuất kế thừa tất thành viên lớp sở, bao gồm tất phương thức biến thành viên lớp sở • Lớp dẫn xuất tự thực thi phiên phương thức lớp sở • Lớp dẫn xuất tạo phương thức thuộc tính • C# cho phép đơn thừa kế lớp • Trong C# lớp bắt buộc phải thừa kế từ lớp v1.0011106202 1.1.2 ĐƠN KẾ THỪA (tiếp theo) Lặp lại giống Ví dụ: class Student 17 class Person { 18 { string name; 19 string name; int age; 20 int age; public void Birthday() { age++; } 21 public void Birthday() { age++; } int id; 22 } public double Calpoint(); 23 class Student : Person } 24 { 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 } v1.0011106202 1.1.2 ĐƠN KẾ THỪA (tiếp theo) Cấp phát nhớ Khi tạo đối tượng lớp thừa kế cấp phát nhớ cho tất trường lớp sở lớp dẫn xuất 33 class Person 44 Public Main() 34 { 35 string name; 45 { 36 int age; 46 37 Student s Student(); 38 } 47 } 39 class Student : Person 40 { 41 int id; 42 43 } v1.0011106202 s static = void new name age id 1.1.2 ĐƠN KẾ THỪA (tiếp theo) Thực thi phương thức lớp sở 49 class Person 50 { 51 public void Birthday() 52 { 53 age++; 54 } 55 56 } 57 class Student : Person 58 { 59 60 } 61 Public static void Main() 62 { 63 Student s = new Student(); 64 s.Birthday(); 65 } Gọi phương thức lớp sở từ đối tượng lớp kế thừa • Có thể gọi phương thức lớp sở từ phương thức lớp dẫn xuất từ khoá “base” • Có thể ẩn phương thức lớp sở cách sử dụng từ khoá “new” v1.0011106202 10 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ự manespace v1.0011106202 20 2.2.1 KHÁI NIỆM LUỒNG • Luồng (thread): Là chuỗi liên tiếp lệnh mà máy tính thực thi • Trong chương trình C# , việc thực thi bắt đầu phương thức Main() tiếp tục kết thúc hàm Main() Do vậy, phương thức Main() phương thức mà NET runtime lấy để bắt đầu cho luồng • Trong chương trình thường muốn làm nhiều nhiệm vụ khác lúc • Lớp luồng Mỗi luồng Win32 thơng qua hàm để chạy tạo Khi luồng quay trở lại từ hàm chấm dứt Trong C#, luồng thao tác cách dùng lớp Thread nằm namespace “System.Threading” Một thể luồng đaị diện cho luồng Có thể tạo luồng khác cách khởi tạo đối tượng luồng v1.0011106202 21 2.2.2 TẠO LUỒNG • Tạo luồng: Thread thread = new Thread(new ThreadStart(ThreadFunc)); thread.Start(); • ThreadFunc là: ThreadStart(SomeClass.aStaticFunction); ThreadStart(someClassInstance.aNonStaticFunction); • Các trạng thái luồng Start(): cho chạy luồng Suspend(): Đình tạm thời luồng để bắt đầu luồng khác Resume(): Gọi phục hồi luồng Sleep(): cho luồng ngủ khoảng thời gian Abort(): huỷ luồng v1.0011106202 22 2.2.2 TẠO LUỒNG (tiếp theo) Các đặc tính luồng: • IsBackground – get, set Quy trình khơng kết thúc luồng “Foreground” kết thúc Các luồng “Background” chấm dứt ứng dụng kết thúc • CurrentThread – get, static Trả luồng tham chiếu để gọi luồng • IsAlive – get Luồng bắt đầu chưa kết thúc • Priority – get, set Highest, AboveNormal, Normal, BelowNormal, Lowest • ThreadState – get Unstarted, Running, Suspended, Stopped, WaitSleepJoin,… v1.0011106202 23 2.2.3 ỨNG DỤNG ĐA NHIỆM • Một ứng dụng cần thực nhiều công việc nên cần thực thi nhiều luồng cơng việc gọi ứng dụng đa nhiệm Khi phải đăng kí độ ưu tiên khác cho luồng khác tiến trình Luồng có độ ưu tiên cao chiếm quyền ưu tiên so với luồng khác tiến trình • Cần thận trọng cấp quyền ưu tiên cho luồng • Một luồng khơng khơng phép hoạt động có luồng có độ ưu tiên cao làm việc • Luồng hệ thống thường có quyền ưu tiên cao Ví dụ Windows có khuynh hướng đặt độ ưu tiên cao cho luồng hệ điều hành • Các mức độ ưu tiên luồng (ThreadPriority) là: Highest AboveNormal Normal BelowNormal Lowest v1.0011106202 24 2.2.3 ỨNG DỤNG ĐA NHIỆM (tiếp theo) • Sự đồng • Sự đồng việc truy nhập biến nhiều luồng vào thời điểm Nếu khơng đảm bảo đồng gây lỗi • C# cung cấp cách thức dễ dàng để giải việc đồng việc truy nhập biến từ khóa lock: lock (x) { DoSomething(); } • Câu lệnh lock bao đối tượng gọi mutual exclusion lock hay mutex Trong mutex bao biến khơng luồng quyền truy nhập vào biến • Trong đoạn mã câu lệnh hợp thực thi time slice luồng kết thúc luồng thử truy xuất vào biến x , việc truy xuất đến biến bị từ chối thay vào window đơn giản đặt luồng ngủ mutex giải phóng Mutex chế đơn giản dùng để điều khiển việc truy nhập vào biến Tất việc điều khiển nằm lớp System.Threading.Monitor Câu lệnh lock gồm số phương thức gọi đến lớp v1.0011106202 25 2.2.3 ỨNG DỤNG ĐA NHIỆM (tiếp theo) Các vấn đề đồng Việc đồng luồng quan trọng ứng dụng đa luồng Tuy nhiên có số lỗi tinh vi khó xuất hiện: • “deadlock”: lỗi xuất hai luồng cần truy nhập vào tài ngun bị khố lẫn • “race condition”: xuất nhiều luồng cố gắng truy nhập vào liệu không quan tâm đến luồng khác làm Khi gặp lỗi dừng thực thi q trình lại làm lỗi liệu v1.0011106202 26 CÂU HỎI THẢO LUẬN Có mức ứng dụng đa nhiệm? So sánh ưu tiên đa nhiệm Windows với chương trình hệ thống? v1.0011106202 27 2.2.3 ỨNG DỤNG ĐA NHIỆM (tiếp theo) Ví dụ “deadlock” • Luồng 1: • Luồng 2: lock (a) lock (b) {// something { // something lock (b) lock (a) { { // something } } Trong a, b hai đối tượng tham chiếu mà hai luồng cần truy cập v1.0011106202 // something } } Hai luồng làm việc: • Luồng 1: lock a, luồng lock b • Luồng 1: lock b rơi vào trạng thái ngủ chờ luồng giải phóng b ngược lại 28 2.2.3 ỨNG DỤNG ĐA NHIỆM (tiếp theo) Kết khắc phục lỗi deadlock • lock a khơng giải phóng luồng lock a ngủ không thức dậy Cho đến lock b giải phóng điều khơng thể xảy luồng thứ hai thức dậy • Kết deadlock, hai luồng không làm cả, đợi lẫn để giải phóng lock • Loại lỗi làm tồn ứng dụng bị treo phải dùng Task Manager để hủy • Deadlock tránh hai luồng yêu cầu lock đối tượng theo thứ tự • Ví dụ: luồng yêu cầu lock thứ tự với luồng 1: a đầu tới b luồng mà lock a đầu hoàn thành nhiệm vụ sau luồng khác bắt đầu v1.0011106202 29 PROPERTIES On passing, 'Finish' button: On failing, 'Finish' button: Allow user to leave quiz: User may view slides after quiz: User may attempt quiz: Goes to Next Slide Goes to Next Slide At any time At any time Unlimited times TĨM LƯỢC CUỐI BÀI v1.0011106202 • Mơ tả cách thức xây dựng lớp dựa lớp có khai thác phạm vi truy cập thuộc tính phương thức lớp lớp dẫn xuất ngơn ngữ C# • Lớp trừu tượng, lớp lồng vấn đề override phương thức lớp kế thừa C# • Mơ tả khái niệm luồng cách tạo luồng vấn đề phát sinh thực luồng Cách khắc phục lỗi sảy sử dụng đa luồng ngơn ngữ C# • Xây dựng modul chương trình quản lý học viên sử dụng tính kế thừa C# • Xây dựng phần mềm có tạo luồng chương trình quản lý học viên 31 PROPERTIES On passing, 'Finish' button: On failing, 'Finish' button: Allow user to leave quiz: User may view slides after quiz: User may attempt quiz: Goes to Next Slide Goes to Next Slide At any time At any time Unlimited times PROPERTIES Allow user to leave interaction: Show ‘Next Slide’ Button: Completion Button Label: Anytime Don't show Next Slide PROPERTIES Allow user to leave interaction: Show ‘Next Slide’ Button: Completion Button Label: Anytime Don't show Next Slide ... Person 50 { 51 public void Birthday() 52 { 53 age++; 54 } 55 56 } 57 class Student : Person 58 { 59 60 } 61 Public static void Main() 62 { 63 Student s = new Student(); 64 s.Birthday(); 65 }... 10 1.1.2 ĐƠN KẾ THỪA (tiếp theo) Gọi phương thức khởi dựng lớp sở 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 class Person { string name; Không kế thừa phương thức int age; khởi dựng... 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