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