Tính đa hình trong lập trình hướng đối tượng

TÓM TẮT Đa hình là một trong bốn tính chất đặc trưng của lập trình hướng đối tượng, đây cũng chính là tính chất khó hiểu nhất, khó phân biệt trong khi lập trình. Trong bài báo này, tôi tập trung vào các yếu tố tạo nên tính đa hình cho đối tượng trong lập trình. Tính đa hình thường liên quan đến kiểu dữ liệu được truyền vào đối tượng và phương thức truyền tham số. Kiểu dữ liệu được thể hiện ở giao diện, phương thức truyền tham số được thể hiện ở việc nạp chồng.

pdf6 trang | Chia sẻ: thanhle95 | Lượt xem: 407 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Tính đa hình trong lập trình hướng đối tượng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
KHCN 2 (31) - 2014 94 KHOA HỌC CÔNG NGHỆ - ĐẠI HỌC HÙNG VƯƠNG involved in dehydration- and cold-inducible gene expression. Biochem Biophys Res Commun 290:998-1009 9. Tamura K, Peterson D, Peterson N, Stecher G, Nei M, Kumar S. 2011. MEGA5: molecular evolutionary genetics analysis using maximum likelihood, evolutionary distance, and maximum parsimony methods. Mol Biol Evol 28:2731-9 10. Wind JJ, Peviani A, Snel B, Hanson J, Smeekens SC. 2013. ABI4: versatile activator and repressor. Trends in Plant Science 18:125-32 11. Wu GA, Prochnik S, Jenkins J, Salse J, Hellsten U, et al. 2014. Sequencing of diverse mandarin, pummelo and orange genomes reveals complex history of admixture during citrus domestication. Nat Biotech 32:656-62 12. Yamaguchi-Shinozaki K, Shinozaki K. 2006. Transcriptional regulatory networks in cellular responses and tolerance to dehydration and cold stresses. Annu. Rev. Plant Biol. 57:781-803 13. Zhang ZW, Feng LY, Cheng J, Tang H, Xu F, et al. 2013. The roles of two transcription factors, ABI4 and CBFA, in ABA and plastid signalling and stress responses. Plant Mol Biol 83:445-58 SUMMARY IDENTIFICATION OF A DREB3 GENE FROM CLEMENTINE (CITRUS CLEMENTINA) BY IN SILICO METHOD Bui Thi Hai Yen, Nguyen Thi Anh, Cao Phi Bang Hung Vuong University DREB3 belong to DREB (dehydration-responsive element binding) transcription factor family which plays an important role in plants. In this work, we identified a DREB3 gene in Clementine by using in silico method. CclDREB3 is similarity to other DREBs belonging to A3 subgroup in many plant species. The full-length genomic sequence of CclDREB3 gene includes 1050 pb. This gene encodes a protein containing 349 amino acid which is weekly basic with pI value of 7.10. 3D modeling structure shows that the AP2 conserved domain of CclDREB3 has a α helix and three-stranded antiparallel β sheet. Keywords: Clementine, DREB3, physico-chemical properties, in silico, 3D modeling, gene dentification. Nguyễn Đình Như Trường Đại học Hùng Vương TÓM TẮT Đa hình là một trong bốn tính chất đặc trưng của lập trình hướng đối tượng, đây cũng chính là tính chất khó hiểu nhất, khó phân biệt trong khi lập trình. Trong bài báo này, tôi tập trung vào các yếu tố tạo nên tính đa hình cho đối tượng trong lập trình. Tính đa hình thường liên quan đến kiểu dữ liệu được truyền vào đối tượng và phương thức truyền tham số. Kiểu dữ liệu được thể hiện ở giao diện, phương thức truyền tham số được thể hiện ở việc nạp chồng. Từ khóa: Đa hình, lập trình hướng đối tượng, nạp chồng. TÍNH ĐA HÌNH TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG KHCN 2 (31) - 2014 95 KHOA HỌC CÔNG NGHỆ - ĐẠI HỌC HÙNG VƯƠNG 1. ĐẶT VẤN ĐỀ Khi đề cập đến lập trình hướng đối tượng người ta hay nhắc đến bốn tính chất căn bản (hay còn gọi là bốn nguyên lý) đó là: tính trừu tượng (Abstraction), tính kế thừa (Inheritance), tính đóng gói (Encapsulation), tính đa hình (Polymorphism). Tuy nhiên, việc nắm rõ cả bốn tính chất này để vận dụng linh hoạt trong việc lập trình vào các bài toán phức tạp là không hề đơn giản. Trong đó, tính đa hình ít được chú ý hơn vì nó khó nhận biết và ít được thể hiện trong lập trình. Đa hình: đa là nhiều, hình là hình thái. Đa hình nghĩa là có nhiều hình thái. Ở đây đang nói đến một đối tượng nhưng lại có nhiều hình thái khác nhau. Chúng ta quan tâm đến việc khi nào, tại sao đối tượng đó lại có nhiều hình thái. Trong thực tế, một đối tượng có thể có những vai trò khác nhau khi đặt vào những hoàn cảnh khác nhau. Ví dụ 1: Một đối tượng người là X khi ở trường học sẽ đóng vai trò là học sinh, sinh viên có nhiệm vụ là học tập, thi cử. Khi về nhà lại đóng vai trò là một người con hoặc người anh, người chị trong gia đình có nhiệm vụ giúp đỡ gia đình. Khi ra chợ lại đóng vai trò là người mua hàng và có thể mua, bán hàng hóa. Đi làm lại đóng vai trò là nhân viên có nhiệm vụ làm việc. Với mỗi vai trò như vậy, đối tượng X sẽ có những hành vi khác nhau phù hợp với từng vai trò của mình. Do vậy, ta có thể hiểu tính đa hình của đối tượng là trong từng trường hợp, hoàn cảnh khác nhau, đối tượng có khả năng thực thi các hành vi, ứng xử khác nhau. Ví dụ 2: Một đội bóng đá gồm các cầu thủ chơi ở những vị trí khác nhau: tiền đạo, tiền vệ, hậu vệ, thủ môn, Mỗi người có cách “đá bóng” khác nhau tùy vào vị trí của mình nhưng chung quy lại thì các cầu thủ đều hiểu được thế nào là đá bóng. Mỗi khi có hiệu lệnh đá bóng thì các cầu thủ đều biết phải đá như thế nào. Đó là các ví dụ đối với con người, còn với các đối tượng (Object) trong lập trình thì sao? Liệu các đối tượng có hiểu những hoàn cảnh khác nhau của mình để đưa ra các hành vi phù hợp hay không? Việc này sẽ dẫn đến những thiết kế tăng cường sự đa hình cho các đối tượng khi lập trình. Lúc này giao diện (Interface) sẽ đóng vai trò quan trọng. Tính đa hình thường liên quan đến kiểu dữ liệu (Data Type) được truyền vào và phương thức (Method) truyền tham số cho đối tượng. Kiểu dữ liệu được thể hiện ở giao diện, phương thức truyền tham số được thể hiện ở việc nạp chồng (Overloading). 2. CÁC YẾU TỐ TẠO NÊN TÍNH ĐA HÌNH 2.1. Kiểu dữ liệu Giao diện giúp ta xây dựng được tính đa hình cho đối tượng. Ta xét ví dụ sau: Có 2 con vật là Mèo và Chó, 2 con vật này đều có hành động là Kêu nhưng ở mỗi con thì có tiếng kêu khác nhau. Ta xây dựng một giao diện Động vật như sau: Code: public interface DongVat { void Keu(); } public class Meo : DongVat { void DongVat.Keu() { KHCN 2 (31) - 2014 96 KHOA HỌC CÔNG NGHỆ - ĐẠI HỌC HÙNG VƯƠNG Console.WriteLine(«Meo meo...»); } } public class Cho : DongVat { void DongVat.Keu() { Console.WriteLine(«Gau gau...»); } } class Program { static void Main(string[] args) { DongVat dv = new NewDongVat.Meo(); dv.Keu(); dv = new NewDongVat.Cho(); dv.Keu(); } } Như vậy 2 lớp Chó và Mèo khi cài đặt giao diện Động vật thì buộc phải cài đặt hành động là Kêu và việc cài đặt cần tuân theo quy định là không tham số, kiểu dữ liệu trả về là void. Bây giờ trên hàm Main ta chỉ cần một đoạn code sau là đã gọi được tiếng kêu của tất cả các con vật: Code: static void Main(string[] args) { DongVat[] dv = { new Cho(), new Meo()}; for (int i = 0; i < dv.Length; i++) { dv[i].Keu(); } } Quay lại với ví dụ 1 về đối tượng người X, ta xây dựng 4 giao diện tương ứng: Code: interface SinhVien { void Hoc(); void Thi(); } interface Con { void Quetnha(); void Nauan(); } interface KhachHang { void Mua(); void Ban(); } interface NhanVien KHCN 2 (31) - 2014 97 KHOA HỌC CÔNG NGHỆ - ĐẠI HỌC HÙNG VƯƠNG { void Lamviec(); } Như vậy, nếu một lớp (Class) cài đặt 4 giao diện trên thì các đối tượng tạo ra từ lớp này sẽ có được tính đa hình. Code: class Nguoi implement SinhVien, Con, KhachHang, NhanVien { void Hoc() { //code } void Thi() { //code } void NauCom() { //code } void Mua() { //code } } Nguoi X = new Nguoi(); Đối tượng người X đã được tạo ra, tuy nhiên chưa có cách thức để thực hiện hành vi. Cách thức thực hiện sẽ do chính lớp cài đặt quy định. Với mỗi yêu cầu về hình thái của đối tượng, X sẽ được truyền vào tương ứng. Ví dụ chỉ chấp nhận đối tượng là Sinh viên thì khi đó X sẽ được truyền vào. Code: class TruongHoc { void Them(SinhVien sv); { //code } } TruongHoc sv1; sv1.Them(X); Khi chỉ chấp nhận đối tượng là Khách hàng, khi đó X được truyền vào. Code: KHCN 2 (31) - 2014 98 KHOA HỌC CÔNG NGHỆ - ĐẠI HỌC HÙNG VƯƠNG class Cho //Chợ { void Them(KhachHang kh); { //code } } Cho kh1; kh1.Them(X); Như vậy, đối tượng X đã thể hiện được trong những hoàn cảnh khác nhau thì đóng vai trò khác nhau, có hành vi khác nhau. X đã có được tính đa hình. 2.2. Phương thức Các dữ liệu và chỉ thị được kết hợp vào một đơn vị đầy đủ tạo nên một đối tượng. Đơn vị này tương đương với một chương trình con và vì thế các đối tượng sẽ được chia thành hai bộ phận chính: phần các phương thức và phần các thuộc tính. Trong thực tế, các phương thức của đối tượng là các hàm và các thuộc tính của nó là các biến, các tham số hay hằng nội tại của một đối tượng. Các phương thức là phương tiện để sử dụng một đối tượng trong khi các thuộc tính sẽ mô tả đối tượng có những tính chất gì. Ở đây ta quan tâm tới phương thức nên chỉ đề cập tới các yếu tố để xác định một phương thức. Đầu tiên là yếu tố tên (Name), đương nhiên tên khác nhau thì sẽ xác định các phương thức khác nhau (mặc dù có thể hai phương thức đều có cấu trúc như nhau). Code: interface SinhVien { void Hoc(); void Thi(); } Tiếp đến là tham số truyền vào (Parameter), các tham số truyền vào khác nhau (không phải là giá trị các tham số khác nhau) thì dẫn đến phương thức sẽ khác nhau. Có 3 dạng khác nhau khi truyền tham số vào: a. Hai phương thức cùng tên nhưng một phương thức có 3 tham số truyền vào, một phương thức có 4 tham số truyền vào thì thì dẫn đến phương thức sẽ khác nhau. Đó là sự khác nhau đối với số lượng tham số truyền vào. Ví dụ: Code: void Hoc(string a, string b, string c); void Hoc(string a, string b, string c, string d); b. Hai phương thức cùng tên, cùng số lượng tham số nhưng không giống nhau về kiểu dữ liệu thì dẫn đến phương thức sẽ khác nhau. Đây là sự khác nhau đối với kiểu dữ liệu của tham số truyền vào. Ví dụ: KHCN 2 (31) - 2014 99 KHOA HỌC CÔNG NGHỆ - ĐẠI HỌC HÙNG VƯƠNG Code: void Hoc(int a, int b, int c); void Hoc(string a, string b, string c); Hoặc Code: Overload x1 = new Overload(5); Overload x2 = new Overload((byte)5); c. Hai phương thức cùng tên, cùng số lượng tham số, cùng kiểu dữ liệu nhưng thứ tự truyền tham số khác nhau sẽ dẫn đến phương thức khác nhau (Lưu ý là phương thức phải có tối thiểu 2 tham số trở lên thì mới có sự phân biệt này). Đây là sự khác nhau đối với thứ tự của tham số truyền vào. Ví dụ: Code: void Hoc(string a, int b); void Hoc(in a, string b); Việc khai báo trong một lớp nhiều phương thức có cùng tên nhưng khác tham số (khác kiểu dữ liệu, khác số lượng tham số, khác thứ tự truyền tham số) gọi là khai báo chồng phương thức hay còn gọi là nạp chồng. Nạp chồng cũng chính là một kiểu đa hình của đối tượng vì nó thể hiện được các hành vi khác nhau tùy thuộc các tham số đầu vào. 3. KẾT LUẬN Bài báo đã minh họa và phân tích các yếu tố tạo nên tính đa hình cho đối tượng trong lập trình, cụ thể là: kiểu dữ liệu được truyền vào và phương thức truyền tham số cho đối tượng. Từ các yếu tố trên, ta có thể tăng cường tính đa hình trong khi thiết kế chương trình giúp cho việc thể hiện các hình thái của đối tượng được phong phú hơn, toàn diện hơn. Tài liệu tham khảo 1. Phạm Văn Ất (2005), C++ và Lập trình hướng đối tượng, Nhà xuất bản Giao thông vận tải. 2. Trần Đức Quang (2005), Lập Trình Hướng Đối Tượng - Những Khái Niệm Chung, Nhà xuất bản Thống kê. SUMMARY POLYMORPHISM IN OBJECT-ORIENTED PROGRAMMING Nguyen Dinh Nhu Hung Vuong University Polymorphism is one of the four characteristics of object-oriented programming, it is also the most confusing characteristic, difficult to distinguish in programming. In this paper, I focus on the elements that create the polymorphism of object in programming. Polymorphism is often related to the data type to be transmitted into the object and the method to transmit parameters. Data type is shown in the interface, the method to transmit parameters is shown in the overloading. Keyword: Polymorphism, Object-oriented Programming, Overloading.