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

