Là 1 đặc điểm chính của pp lthđt
Đa hình cho phép 1 đối tượng sẽ thể 
hiện đúng hành vi tính chất của đối 
tượng mà nó trỏ (gán) đến
Cụ thể khi ta gán 1 đối tượng x của 
lớp cha bằng đối tượng y của lớp con 
thì đối tượng x phải thể hiện hành vi 
tính chất của đối tượng y
                
              
                                            
                                
            
                       
            
                 17 trang
17 trang | 
Chia sẻ: lylyngoc | Lượt xem: 1809 | Lượt tải: 2 
              
            Bạn đang xem nội dung tài liệu Lập trình hướng đối tượng Chương 4: Đa hình, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH 
HƯỚNG ĐỐI TƯỢNG
Chương 4 
Đa hình
polymorphism
Đa hình (polymorphism)
 Là 1 đặc điểm chính của pp lthđt
 Đa hình cho phép 1 đối tượng sẽ thể 
hiện đúng hành vi tính chất của đối 
tượng mà nó trỏ (gán) đến
 Cụ thể khi ta gán 1 đối tượng x của 
lớp cha bằng đối tượng y của lớp con 
thì đối tượng x phải thể hiện hành vi 
tính chất của đối tượng y
Ví dụ
 Lớp động vật có phương thức kêu (xuất ra dòng 
chữ “aaa”)
 Lớp mèo kế thừa từ lớp động vật, cũng có phương 
thức kêu (xuất ra dòng chữ “meo meo”)
 Khi ta khai báo động vật là một con mèo thì nó phải 
kêu meo meo
 Dv1 là instance của động vật
 M1 là instance của mèo
 Dv1=M1
 khi gọi Dv1.keu() kết quả như thế nào?
Cài đặt Đa hình
 Các phương thức của lớp con có cùng 
tên với phương thức của lớp cha thì 
khi cài đặt đa hình ta thực hiện
– Thêm từ khoá virtual vào trước khai báo 
phương thức của lớp cha
– Thêm từ khoá override vào trước khai 
báo phương thức trùng tên của lớp con
Ghi chú
 virtual: hàm ảo
 override: hàm che (dùng để che hàm 
ảo của lớp cha và thực hiện hàm che 
trước)
public class DONGVAT
{
string ten;
int cannang;
public DONGVAT()
{
ten="";
cannang=0;
}
public DONGVAT(string ten,int cannang)
{
this.ten=ten;
this.cannang=cannang;
}
virtual public void keu() //ảo
{
Console.Write("\n AAA!!!");
}
virtual public void xuat()
{
Console.Write("\nTen: "+ten+"\nCan nang: "+cannang+" Kg");
}
}
class MEO:DONGVAT 
{
string maulong;
public MEO():base()
{
maulong = "";
}
public MEO(string ten, int cannang, string maulong): base(ten, cannang)
{
this.maulong = maulong;
}
override public void keu()
{
Console.Write("\n MEO MEO!!!");
}
override public void xuat()
{
base.xuat();
Console.Write("\n mau long:{0}", maulong);
}
}
class CHO:DONGVAT 
{
string maulong;
public CHO ():base()
{
maulong = "";
}
public CHO (string ten, int cannang, string maulong): base(ten, cannang)
{
this.maulong = maulong;
}
override public void keu()
{
Console.Write("\n GAU GAU!!!");
}
override public void xuat()
{
base.xuat();
Console.Write("\n mau long:{0}", maulong);
}
}
class Program
{
static void Main(string[] args)
{
DONGVAT[] dv = new DONGVAT[3];//mang 3 dong vat
dv[0] = new DONGVAT();
dv[0].keu();
dv[1] = new CHO("Lulu",15,"vang");
dv[1].keu();
dv[2] = new MEO("Doremon",3,"xanh");
dv[2].keu();
}
}
Lớp object
 gốc của tất cả các lớp
 Override Tostring()
Lớp sealed
 Không cho kế thừa
Lớp lồng
 Là lớp nằm trong 1 lớp khác nhằm hỗ 
trợ cục bộ lớp chứa nó
public class Fraction
{
private int numerator; // biến thành viên private
private int denominator;
public Fraction( int numerator, int denominator)
{
this.numerator = numerator;
this.denominator = denominator;
}
public override string ToString()
{
StringBuilder s = new StringBuilder();
s.AppendFormat(“{0}/{1}”,numerator, denominator);
return s.ToString();
}
internal class FractionArtist
{
public void Draw( Fraction f)
{
Console.WriteLine(“Drawing the numerator {0}”, f.numerator);
Console.WriteLine(“Drawing the denominator {0}”, f.denominator);
}
}
}
public class Tester
{
static void Main()
{
Fraction f1 = new Fraction( 3, 4);
Console.WriteLine(“f1: {0}”, f1.ToString());
Fraction.FractionArtist fa = new Fraction.FractionArtist();
fa.Draw( f1 );
}
}
Hàm trừu tượng
Lớp trừu tượng(Abstract)
 Hàm trừu tượng là hàm không có sự thực thi
– Khai báo abstract kieu tenham();
– Ví dụ hàm keu() của lớp động vật không thực thi,
– abstract void keu();
 Lớp trừu tượng là lớp không có đối tượng cụ thể, 
nó dùng để cho các lớp khác kế thừa nó. 
 Ví dụ
– Lớp chó, lớp mèo … kế thừa lớp động vật
– Lớp tam giác, hình tròn… kế thừa từ lớp hình học
 Lớp trừu tượng chứa ít nhất một hàm trừu tượng
 Khai báo lớp trừu tượng bằng cách thêm từ khoá 
abstract vào trước tên lớp
Ví dụ sv tự cài đặt
 lớp động vật là lớp trừu tượng có hàm trừu 
tượng keu();
 Lớp chó, mèo: kế thừa từ lớp động vật
 Lớp hình học là lớp trừu tượng có hàm trừu 
tượng: tinhdientich();, tinhchuvi();
 Lớp tam giác, hình chữ nhật kế thừa từ lớp 
hình học…