OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 1 Virtual method & Polymorphism Virtual method & Polymorphism 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ạ
Trang 1OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 1
Virtual method
& Polymorphism
Virtual method
& Polymorphism
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.
Trang 2OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 3
Đ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
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.
Trang 3OOP 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
VD:
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”);
Trang 4OOP 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ì?
VD:
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:
Trang 5OOP 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ì?
VD:
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:
Trang 6OOP 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
VD:
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”);
Trang 7OOP 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
VD: thể hiện tính đa hình
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();
}
Trang 8OOP 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
{
Return 3 ; }
}
class Program {
static void Main() {
Child o = new Child();
} }
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