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.

pdf8 trang | Chuyên mục: Visual C# | Chia sẻ: dkS00TYs | Lượt xem: 2097 | Lượt tải: 3download
Tóm tắt nội dung Phương thức ảo và tính đa hình, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pdf04_Virtual_Polymorphism.pdf