Phương thức ảo và tính đa hình
¾Hai đ Hai đặc đi c điểm mạnh nhất của kếthừa đ a đólà
khảnăng s năng sửdụng lại mã chương tr i mã chương trình và đa đa
hình (polymorphism).
¾Đa h Đa hình làý tư ý tưởng “sửdụng một giao diện
chung cho nhiều phương th u phương thức khác nhau”,
dựa trên phương th a trên phương thức ảo (virtual method).
¾Nói cách khác, Tính đa h nh đa hình cho phép một
thao tác cócác cách xửlý khác nhau trên
các đ c đối tư i tượng khác nhau.
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com1 Phương thức ảo và tính đa hình Virtual method & Polymorphism OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com2 Tính đa hình ¾Hai đặc điểm mạnh nhất của kế thừa đó là khả năng sử dụng lại mã chương trình và đa hình (polymorphism). ¾Đa hình là ý tưởng “sử dụng một giao diện chung cho nhiều phương thức khác nhau”, dựa trên phương thức ảo (virtual method). ¾Nói cách khác, Tính đa hình cho phép một thao tác có các cách xử lý khác nhau trên các đối tượng khác nhau. OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com3 Điều kiện cài đặt Tính đa hình ¾Để thực hiện được tính đa hình ta phải thực hiện các bước sau: Lớp cơ sở đánh dấu phương thức ảo bằng từ khóa virtual hoặc abstract Các lớp dẫn xuất định nghĩa lại phương thức ảo này (đánh dấu bằng từ khóa override) ¾Nhưng, những thành viên (member fields) or những thuộc tính (properties) và những hàm tĩnh (static) thì không được khai báo Virtual OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com4 Tham chiếu giữa lớp cơ sở và lớp dẫn xuất ¾Tham chiếu thuộc base class có thể trỏ đến object thuộc derived class và có thể truy cập virtual method đã define lại trong derived class ¾Nếu tham chiếu này trỏ tới object thuộc base class thì virtual method của lớp cơ sở được thực hiện. ¾Nếu tham chiếu này trỏ tới object thuộc derived class thì virtual method đã được derived class định nghĩa lại được thực hiện. OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: minh họa class Tau { public void LayThongtin() { Console.WriteLine(“Day la chiec Tau”); } } 5 ¾Ta xay dựng 3 class: 9Lớp Tau là lớp cơ sở 9Lớp TauChien và TauChoHang là lớp dẫn xuất từ lớp Tau OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: 6 class TauChien : Tau { public void LayThongTin() { Console.WriteLine(“Day la tau Chien ”); } } class TauChoHang : Tau { public void LayThongTin() { Console.WriteLine(“Day la tau Cho Hang”); } } OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: 7 class Program { static void Main(string[] args) { Tau a = new Tau(); TauChien b = new TauChien(); TauChoHang c = new TauChoHang(); a.LayThongTin(); b.LayThongTin(); c.LayThongTin(); } } // Màn hình sẽ xuất hiện điều gì? OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: 8 Nhưng ở đây ta chưa thấy được tính đa hình gì hết trong lập trình hướng đối tượng. Dau la chiec Tau Dau la tau Chien Dau la tau Cho Hang Kết quả xuất ra: OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com Nếu ta khai báo 3 object đề là lớp Tau 9 class Program { static void Main(string[] args) { Tau a = new Tau(); Tau b = new TauChien(); Tau c = new TauChoHang(); a.LayThongTin(); b.LayThongTin(); c.LayThongTin(); } } // Màn hình sẽ xuất hiện điều gì? OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: 10 Ta đã thấy được tính đa hình, nhưng chưa đầy đủ do việc kết xuất ra những kết không mong muốn Dau la chiec Tau Dau la chiec Tau Dau la chiec Tau Kết quả xuất ra: OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: Đa hình class Tau { public virtual void LayThongtin() { Console.WriteLine(“Day la chiec Tau”); } } 11 ¾Để khắc phục tình trạng trên ta phải dùng từ khóa virtual cho phương thức của lớp cơ sở và từ khóa override cho tương ứng lớp dẫn xuất OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: 12 class TauChien:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Chien ”); } } class TauChoHang:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Cho Hang”); } } OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: class Program { static void Main(string[] args) { Tau a = new Tau(); Tau b = new TauChien(); Tau c = new TauChoHang(); a.LayThongTin(); b.LayThongTin(); c.LayThongTin(); } } 13 Day la chiec Tau Day la tau Chien Day la tau Cho Hang OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com VD: thể hiện tính đa hình 14 class Program { static void Main(string[] args) { Tau [] t = new Tau[3]; t[0] = new Tau(); t[1] = new TauChien(); t[2] = new TauChoHang(); for(int i=0; i<3; i++) t[i].LayThongTin(); } } OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com class Parent { public int A() { return ( B() *C() ); } public virtual int B() { return 1 ; } public int C() { return 2 ; } } class Child : Parent { public override int B() { Return 3 ; } } class Program { static void Main() { Child o = new Child(); Console.WriteLine( o.A() ); } } OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com16 Q&A Bài tập: 1. Đọc lại bài giảng 2. Làm các bài VD & bài tập trong GT 3. Đọc bài: Trừu tượng 16
File đính kèm:
- 04_Virtual_Polymorphism.pdf