Bài giảng Lập trình hướng đối tượng - Chương 10: Xây dựng class tổng quát hóa bằng VC#

10.0 Dẫn nhập

10.1 Tổng quát về interface và class tổng quát hóa

10.2 Class cụ thể : Stack các số nguyên

10.3 Class tổng quát hóa : Stack các phần tử kiểu T

10.4 Ràng buộc về tham số kiểu hình thức

10.5 Sử dụng class tổng quát hóa

10.6 Kết chương

pdf 24 trang phuongnguyen 3020
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Chương 10: Xây dựng class tổng quát hóa bằng VC#", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình hướng đối tượng - Chương 10: Xây dựng class tổng quát hóa bằng VC#

Bài giảng Lập trình hướng đối tượng - Chương 10: Xây dựng class tổng quát hóa bằng VC#
 Chương 10
 Xây dựng class tổng quát hóa bằng VC#
 10.0 Dẫn nhập
 10.1 Tổng quát về interface và class tổng quát hóa
 10.2 Class cụ thể : Stack các số nguyên
 10.3 Class tổng quát hóa : Stack các phần tử kiểu T
 10.4 Ràng buộc về tham số kiểu hình thức
 10.5 Sử dụng class tổng quát hóa
 10.6 Kết chương
Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
© 2010 Slide 1
10.0 Dẫn nhập 
 Chương này giới thiệu một loại class ₫ặc biệt : class tổng quát hóa,
 nó giúp người lập trình tối thiểu hóa việc viết họ các class có tính
 chất giống nhau.
 Chương này cũng giới thiệu cách miêu tả các thông tin ràng buộc
 kèm theo từng tên kiểu hình thức ₫ược dùng trong class tổng quát
 hóa, cách dùng class tổng quát hóa ₫ể yêu cầu máy sinh mã tự
 ₫ộng ra class cụ thể.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 2
10.1 Tổng quát về interface và class tổng quát hóa
 Trong phương pháp xây dựng chương trình hướng ₫ối tượng,
 chương trình là tập các ₫ối tượng sống và tương tác lẫn nhau ₫ể
 hoàn thành nhiệm vụ. Số lượng các ₫ối tượng cấu thành phần mềm
 thường rất lớn, nhưng chúng thường thuộc 1 số loại xác ₫ịnh. Viết
 phần mềm hướng ₫ối tượng là quá trình lặp ₫ặc tả các loại ₫ối
 tượng cấu thành chương trình.
 Trong các chương trình lớn và phức tạp, số loại ₫ối tượng cần ₫ặc
 tả có thể lớn nên thời gian, công sức ₫ặc tả chúng cũng sẽ lớn.
 Để giảm nhẹ thời gian, công sức ₫ặc tả các ₫ối tượng, mô hình
 hướng ₫ối tượng ₫ã giới thiệu tính thừa kế : ta không ₫ặc tả ₫ối
 tượng từ ₫ầu (zero) mà dùng lại ₫ặc tả có sẵn rồi hiệu chỉnh/thêm
 các thành phần mới. Tuy nhiên, thừa kế cũng chỉ giúp giảm nhẹ
 công sức ₫ặc tả interface/class, chứ chưa triệt tiêu việc ₫ặc tả.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 3
10.1 Tổng quát về interface và class tổng quát hóa
 Trong chương này, chúng ta sẽ thấy ₫ược phương pháp khác, nó
 cũng cho phép ta giảm nhẹ và triệt tiêu việc ₫ặc tả interface/class
 cho 1 số class cấu thành ứng dụng. Phương pháp này ₫ược gọi là
 tổng quát hóa.
 Ta biết, 1 hàm không tham số chỉ có thể thực hiện 1 thuật giải cố
 ₫ịnh trên các dữ liệu cố ₫ịnh và cho kết quả cố ₫ịnh, cho dù ta gọi
 nó bao nhiêu lần. Thí dụ hàm Cos() chỉ có thể tính ₫ược Cos của
 góc nào ₫ó (₫ược xác ₫ịnh cứng trong thân hàm).
 Nếu thêm tham số cho hàm, nó sẽ thực hiện 1 thuật giải nhưng trên
 các dữ liệu khác nhau mà những lần gọi khác nhau người ta truyền
 cho nó, như vậy kết quả cũng sẽ khác nhau. Thí dụ hàm Cos(x) có
 thể tính Cos của góc x bất kỳ, tùy thuộc mỗi lần gọi nó, người ta
 truyền góc nào.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 4
10.1 Tổng quát về interface và class tổng quát hóa
 Như vậy, ta nói hàm có tham số sẽ có tính năng tổng quát hơn hàm
 không tham số. Càng có nhiều tham số, hàm càng có tính tổng quát
 hơn.
 Tương tự, nếu ta ₫ặc tả 1 class bình thường như ₫ã thấy trong các
 chương trước, ta nói class dạng này là class cụ thể. Class cụ thể chỉ
 có thể chứa và xử lý các dữ liệu xác ₫ịnh trước. Class cụ thể chỉ có
 thể tạo ra các ₫ối tượng có dữ liệu ₫ược class xác ₫ịnh.
 Trong lập trình, chúng ta mơ ước có ai ₫ó viết dùm mình các class
 cụ thể mà chương trình cần. Class tổng quát hóa sẽ giúp ta ₫iều
 này. Nhiệm vụ của class tổng quát hóa là viết dùm con người các
 class cụ thể mà chương trình cần dùng.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 5
10.1 Tổng quát về interface và class tổng quát hóa
 Sự khác biệt giữa class tổng quát hóa và class cụ thể cũng giống
 như sự khác biệt giữa hàm có tham số và hàm không có tham số.
 Cụ thể ta sẽ ₫ịnh nghĩa từ 1 ₫ến n tên kiểu hình thức mà sẽ ₫ược
 dùng trong class tổng quát hóa. Trong thân của class tổng quát hóa,
 ta sẽ dùng các tên kiểu hình thức ₫ể ₫ặc tả cho các dữ liệu. Như vậy
 class tổng quát hóa không thể tạo ₫ối tượng cụ thể (₫iều này không
 có nghĩa), nó chỉ có thể tạo ra class cụ thể khi ₫ược truyền các tên
 kiểu cụ thể.
 Để thấy rõ sự khác biệt giữa class tổng quát hóa và class cụ thể,
 trước tiên ta hãy xây dựng 1 class quản lý Stack các số nguyên có
 dung lượng tùy ý, nó có 2 tác vụ chức năng là push(int) và pop().
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 6
10.2 Class cụ thể : Stack các số nguyên
//₫ịnh nghĩa class Stack các số nguyên
public class IntStack {
 //₫ịnh nghĩa các thuộc tính cần dùng
 private int[] data; //danh sách ₫ặc các số nguyên trong stack
 private int top; // chỉ số phần tử ₫ỉnh stack
 private int max; // số lượng max hiện hành của stack
 private int GROWBY = 4; //bước tăng dung lượng stack
 //hàm constructor
 public IntStack() {
 top = 0;
 max =GROWBY;
 //lúc ₫ầu, phân phối GROWBY phần tử
 data = (int[])new int[max];
 }
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 7
10.2 Class cụ thể : Stack các số nguyên
 //hàm push phần tử vào stack
 public bool push(int newVal) {
 int[] newdata;
 if (top==max) { //kiểm tra xem stack ₫ầy chưa
 //tạo vùng nhớ chứa các phần tử stack
 //hơn GROWBY phần tử
 try {
 newdata = (int[])new int[GROWBY+max];
 } catch (Exception e) {
 return false; //nếu hết bộ nhớ thì báo lỗi
 }
 //copy các phần tử từ stack cũ vào stack mới
 for (int i = 0; i<max; i++) newdata[i] =data[i];
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 8
10.2 Class cụ thể : Stack các số nguyên
 //ghi nhớ vùng stack mới
 data = newdata;
 max += GROWBY;
 }
 //chứa phần tử mới vào ₫ỉnh stack
 data[top++] = newVal;
 return true; //báo thành công
 }
 //hiện thực hàm pop phần tử từ ₫ỉnh stack
 public int pop() {
 if (top == 0) //kiểm tra hết stack chưa
 throw new Exception ("Cạn stack");
 else return data[--top]; //return phần tử ở ₫ỉnh stack
 }
} Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 9
10.3 Class tổng quát hóa : Stack các phần tử kiểu T
 Đặc tả class IntStack ở mục 8.2 miêu tả stack các số nguyên. Giả
 sử trong 1 chương trình nào ₫ó, ta cần thêm stack các số thực,
 stack các chuỗi, stack các trị luận lý, stack các ₫ối tượng,...
 Nếu ta tự viết lấy các class còn lại (thường bằng cách dùng lại ₫ặc
 tả class IntStack rồi hiệu chỉnh lại các chi tiết cho phù hợp với kiểu
 phần tử trong stack mới) thì cũng ₫ược, nhưng ₫ây là cách làm tốn
 nhiều thời gian, công sức, nhưng không hiệu quả, không tin cậy,
 dễ gây lỗi,...
 Do ₫ó ta sẽ ₫ịnh nghĩa class tổng quát hóa miêu tả Stack các phần
 tử thuộc kiểu T nào ₫ó bằng cách :
 1. dùng class IntStack cụ thể, tìm và thay thế kiểu phần tử cụ thể
 (int) thành tên kiểu hình thức (T).
 2. ₫ịnh nghĩa kiểu hình thức T trong danh sách tham số của phát
 biểu class.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 10
10.3 Class tổng quát hóa : Stack các phần tử kiểu T
//₫ịnh nghĩa class tổng quát hóa : Stack các phần tử thuộc kiểu T
public class ValueStack {
 //₫ịnh nghĩa các thuộc tính cần dùng
 private T[] data; //danh sách ₫ặc các phần tử T trong stack
 private int top; // chỉ số phần tử ₫ỉnh stack
 private int max; // số lượng max hiện hành của stack
 private int GROWBY = 4; //bước tăng dung lượng stack
 //hàm constrcutor
 public ValueStack() {
 top = 0;
 max =GROWBY;
 //lúc ₫ầu, phân phối GROWBY phần tử
 data = (T[])new T[max];
 }
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 11
10.3 Class tổng quát hóa : Stack các phần tử kiểu T
 //hàm push phần tử vào stack
 public bool push(T newVal) {
 T[] newdata;
 if (top==max) { //kiểm tra xem stack ₫ầy chưa
 //tạo vùng nhớ chứa các phần tử stack
 //hơn GROWBY phần tử
 try {
 newdata = (T[])new T[GROWBY+max];
 } catch (Exception e) {
 return false; //nếu hết bộ nhớ thì báo lỗi
 }
 //copy các phần tử từ stack cũ vào stack mới
 for (int i = 0; i<max; i++) newdata[i] =data[i];
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 12
10.3 Class tổng quát hóa : Stack các phần tử kiểu T
 //ghi nhớ vùng stack mới
 data = newdata;
 max += GROWBY;
 }
 //chứa phần tử mới vào ₫ỉnh stack
 data[top++] = newVal;
 return true; //báo thành công
 }
 //hiện thực hàm pop phần tử từ ₫ỉnh stack
 public T pop() {
 if (top == 0) //kiểm tra hết stack chưa
 throw new Exception ("Cạn stack");
 else return data[--top]; //return phần tử ở ₫ỉnh stack
 }
} Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 13
10.4 Ràng buộc về tham số kiểu hình thức
 Trong class tổng quát hóa ValueStack ₫ược ₫ịnh nghĩa ở mục 8.3,
 ta có dùng kiểu hình thức có tên là T. Nếu không có thông tin gì
 khác ngoài tên hình thức T thì trong thân của class ValueStack, ta
 chỉ có thể gán các biến dữ liệu thuộc kiểu hình thức T chứ không
 thể thực hiện ₫ược gì khác trên các dữ liệu thuộc kiểu T này.
 Trong trường hợp cần thực hiện nhiều hoạt ₫ộng xử lý khác trên
 các dữ liệu thuộc kiểu hình thức T, thí dụ gởi thông ₫iệp nhờ thực
 hiện 1 tác vụ nào ₫ó, ta phải ₫ịnh nghĩa thông tin ràng buộc về
 kiểu T.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 14
10.4 Ràng buộc về tham số kiểu hình thức
 VC# cho phép ta ₫ịnh nghĩa thông tin ràng buộc về kiểu hình thức
 T theo cú pháp sau :
 //₫ịnh nghĩa class có 3 tham số kiểu hình thức
 class ValueStack 
 where T : 
 where K : 
 where L : 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 15
10.4 Ràng buộc về tham số kiểu hình thức
 Ta có thể dùng 1 trong 5 dạng ràng buộc sau ₫ây :
 1. where T: struct kiểu T phải là kiểu giá trị (kiểu cổ ₫iển)
 2. where T: class kiểu T phải là kiểu tham khảo (class,
 delegate,...)
 3. where T: new( ) kiểu T phải là kiểu ₫ối tượng và phải có
 hàm contructor không tham số (contructor mặc ₫ịnh)
 4. where T: kiểu T phải là kiểu ₫ối tượng
 và phải tương thích với class 
 5. where T: kiểu T phải là kiểu ₫ối tượng và
 phải tương thích với interface 
 Mặc ₫ịnh, nếu không khai báo gì thì ₫ược hiểu là where T: struct.
 Như vậy class ValueStack ₫ược ₫ịnh nghĩa ở mục 8.3 chỉ quản lý
 các dữ liệu cổ ₫iển như số nguyên, số thực,...
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 16
10.4 Ràng buộc về tham số kiểu hình thức
 Nếu muốn viết class tổng quát hóa miêu tả stack các ₫ối tượng bất
 kỳ, ta chỉ cần hiệu chỉnh lại lệnh ₫ặc tả class từ :
 class ValueStack 
 hay
 class ValueStack where T : struct
 thành
 class RefStack where T : class
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 17
10.5 Sử dụng class tổng quát hóa
 Sau khi có class cụ thể A, chương trình có thể tạo ₫ối tượng cụ thể
 thuộc class cụ thể bằng cách gọi lệnh new :
 A obj = new A();
 Bản thân class tổng quát hóa không thể tạo ra ₫ối tượng ₫ược
 dùng trong chương trình như các class thông thường. Nhiệm vụ
 của nó là tạo ra ₫ặc tả class cụ thể. Thí dụ sau khi ₫ã ₫ặc tả ₫ược 2
 class tổng quát hóa ValueStack, RefStack trong mục 8.3 và 8.4,
 nếu ta cần viết tự ₫ộng class stack các nguyên, stack các thực,... thì
 ta chỉ cần viết lệnh như sau :
ValueStack si; //₫ịnh nghĩa biến stack các số nguyên
ValueStack sd; //₫ịnh nghĩa biến stack các số thực
RefStack sri; //biến stack các ₫ối tượng nguyên
RefStack srd; //biến stack các ₫ối tượng thực
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 18
10.5 Sử dụng class tổng quát hóa
 Chương trình sau demo việc dùng ValueStack ₫ể quản lý các số
 nguyên :
static void Main(string[] args) {
 int i;
 //₫ịnh nghĩa class stack các số nguyên và biến thuộc class này
 ValueStack si = new ValueStack ();
 //push lần lượt các trị từ -5 tới 5
 for (i = -5; i <= 5; i++) {
 if (!si.push(i)) {
 Console.WriteLine("Không push ₫ược nữa!!!");
 return;
 }
 }
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 19
10.5 Sử dụng class tổng quát hóa
 //pop ra từng phần tử cho ₫ến khi hết stack
 try {
 while (true) {
 int ci = si.pop();
 Console.WriteLine("Trị vừa pop ra là : " + ci);
 }
 }
 //xử lý lỗi khi hết stack
 catch (Exception e) {
 Console.Write("Hết stack. Ấn Enter ₫ể ₫óng cửa sổ");
 Console.Read();
 }
}
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 20
10.5 Sử dụng class tổng quát hóa
 Chương trình sau demo việc dùng RefStack ₫ể quản lý các ₫ối
 tượng, mỗi ₫ối tượng chứa 1 số nguyên :
static void Main(string[] args) {
 int i;
 //₫ịnh nghĩa class stack các ₫ối tượng nguyên (class MyInt)
 //và biến thuộc class này
 RefStack si = new RefStack ();
 //push lần lượt các trị từ -5 tới 5
 for (i = -5; i <= 5; i++) {
 if (!si.push(new MyInt(i))) {
 Console.WriteLine("Không push ₫ược nữa!!!");
 return;
 }
 }
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 21
10.5 Sử dụng class tổng quát hóa
 //pop ra từng phần tử cho ₫ến khi hết stack
 try {
 while (true) {
 MyInt ci = si.pop();
 Console.WriteLine("Trị vừa pop ra là : " + ci.Value);
 }
 }
 //xử lý lỗi khi hết stack
 catch (Exception e) {
 Console.Write("Hết stack. Ấn Enter ₫ể ₫óng cửa sổ");
 Console.Read();
 }
}
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 22
10.5 Sử dụng class tổng quát hóa
 Chương trình ở slide trước có sử dụng class MyInt ₫ể quản lý số
 nguyên ₫ược ₫ịnh nghĩa như sau :
class MyInt {
 //₫ịnh nghĩa thuộc tính vật lý chứa số nguyên
 private int m_value;
 //₫ịnh nghĩa thuộc tính luận lý ₫ể truy xuất số nguyên
 public int Value {
 get { return m_value; }
 set { m_value = value; }
 }
 //₫ịnh nghĩa hàm contructor
 public MyInt(int val) { m_value = val; }
}
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 23
10.6 Kết chương 
 Chương này ₫ã giới thiệu một loại class ₫ặc biệt : class tổng quát
 hóa, nó giúp người lập trình tối thiểu hóa việc viết họ các class có
 tính chất giống nhau.
 Chương này cũng ₫ã giới thiệu cách miêu tả các thông tin ràng
 buộc kèm theo từng tên kiểu hình thức ₫ược dùng trong class tổng
 quát hóa, cách dùng class tổng quát hóa ₫ể yêu cầu máy sinh mã
 tự ₫ộng ra class cụ thể.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 10 : Xây dựng class tổng quát hóa bằng VC#
 © 2010 Slide 24

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_chuong_10_xay_dung_class.pdf