Khoa Hệ thống thông tin kinh doanh
Trường Đai học Kinh Tế TP.HCM
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
K TH A – ĐA HÌNH
Ế Ừ
N i dung
ộ
1. K th a
ế ừ
2. Đa hình
3. L p tr u t
ừ ượ ng
ớ
4. L p niêm phong
ớ
5. L p trong l p
ớ
ớ
6. Giao di nệ
KẾ THỪA (inheritance)
K th a là gì?
ế ừ
Đ nh nghĩa k th a
ế ừ
ị
K th a cho phép t o ra m t l p có (k th a) thu c ng th c c a m t l p khác.
ế ừ ộ
ế ừ tính và ph ộ ớ ộ ớ
ạ ứ ủ ươ L p cha trong k th a đ c g i là l p c s (base ế ừ ơ ở ượ ớ ọ ớ
L p con k th a t
class).
m t l p cha đ ế ừ ừ ộ ớ ượ c g i là l p d n ớ ẫ ọ
Khai báo l p d n xu t k th a m t l p c s :
xu t (derived class). ớ ấ
ấ ế ừ ơ ở ộ ớ ẫ ớ
ẫ
ớ
ơ ở
ớ
class :
ấ
{
…………………….
}
Ví d k th a
ụ ế ừ
Furniture
Table Chair
Desk
Sofa
Dining Table
Lounge Chair
class desk: table class table: furniture
class dining_table: table
Đ n k th a và đa k th a
ế ừ
ế ừ
ơ
Đ n k th a là m t l p d n xu t ch đ
ộ ớ ỉ ượ ấ ẫ c k th a ế ừ
ơ ế ừ m t l p c s t ừ ộ ớ
ơ ở Đa k th a là m t l p d n xu t đ c k th a t ộ ớ ẫ ấ ượ ế ừ ừ
C# ch cho phép 1 l p đ
ế ừ nhi u l p c s ề ớ ơ ở
c k th a t ơ ở ớ ớ
ế ừ ừ ề 1 l p c s . ệ ượ ự ằ
ỉ Đa k th a b ng cách th c thi nhi u giao di n ế ừ (interface).
c gì?
K th a đ ế ừ
ượ
D n xu t t
c s
ấ ừ ơ ở
ẫ
Thành viên A
Thành viên A
Thành viên B
Thành viên B
D n xu t t
ấ ừ
ẫ
Thành viên C
Thành viên C
Thành viên D
L p c s
ơ ở
ớ
Đ c t o trong l p d n xu t ấ
ượ ạ
ớ
ẫ
L p d n xu t ấ ẫ
ớ
Ví d 5’ụ
class ConNguoi {
public ConNguoi(){ ….. }
L p SinhVien ớ k th a t ế ừ ừ l p ConNguoi ớ
} class SinhVien:ConNguoi{ public SinhVien() { ……… }
}
G i hàm kh i t o c a l p c s
ủ ớ
ở ạ
ơ ở
ọ
Vì l p d n xu t
ẫ ớ ể ế ừ
ự ả ấ không th k th a ph ủ l p c s ứ ng th c kh i ươ ở ứ ơ ở nên m t ộ l p d n ẫ ớ ớ ng th c kh i t o riêng c a ủ ở ạ ươ
t o (Constructor) c a ạ xu tấ ph i th c thi ph nó.
ớ ơ ở m t ph ộ ở ạ ươ ứ ặ
ấ đ ượ
N u ế l p c s có ng th c kh i t o m c ng th c kh i t o không có tham s ) thì đ nh (ph ở ạ ứ ị ố ươ c đ nh ủ l p d n xu t ng th c kh i t o c a ph ị ẫ ở ạ ứ ươ nghĩa nh cách thông th ườ
ớ ng. ư
G i hàm kh i t o c a l p c s
ủ ớ
ở ạ
ơ ở
ọ
ứ
N u l p c s có ph ẫ
ng th c t o ế ớ ớ ươ ả ị ng th c kh i t o có tham s ố ở ạ ươ ứ ạ
TênL pCon(ThamS L pCon):
thì l p d n xu t ph i đ nh nghĩa ph l p có tham s theo cú pháp sau: ậ ơ ở ấ ố
base (ThamS L pCha)
ố ớ
ớ
ố ớ
{
// Kh i t o giá tr cho các thành ph n c a l p d n xu t ấ
ủ ớ
ở ạ
ẫ
ầ
ị
}
G i hàm kh i t o c a l p c s
ủ ớ
ở ạ
ơ ở
ọ
ớ
// L p c s Point2D ơ ở class Point2D { public int x,y; public Point2D(int a, int b) {
x = a ; y = b;
} public void Xuat2D() {
Console.WriteLine("({0}, {1} )", x, y);
}
}
G i hàm kh i t o c a l p c s
ủ ớ
ở ạ
ơ ở
ọ
// Lop dan xuat Point3D ke thua tu lop Point2D class Point3D:Point2D {
public int z; public Point3D(int a,int b,int c) : base(a,b) {
z = c ;
} public void Xuat3D() {
Console.WriteLine("({0}, {1} , {2})", x, y, z);
}
}
G i hàm kh i t o c a l p c s
ủ ớ
ở ạ
ơ ở
ọ
public static void Main() {
Point2D p2 = new Point2D(1,2); Console.Write("Toa do cua diem 2 D :"); p2.Xuat2D(); Point3D p3 = new Point3D(4,5,6); Console.Write("Toa do cua diem 3 D :"); p3.Xuat3D(); Console.ReadLine();
}
Đ nh nghĩa phiên b n m i trong l p d n xu t ấ
ả
ẫ
ớ
ớ
ị
ẫ
ng h p l p d n xu t có thu c tính ho c ộ ấ không có t ng th c trùng tên ( ườ ươ ợ ớ ứ ừ
Tr ph hay virtual) trong l p c s thì trình biên d ch s có c nh báo d ng nh sau: ạ ả
ặ khoá abstract ị ơ ở ẽ
ớ ư
“keyword new is required on ‘L pD nXu t.X’ ẫ ớ
because it hides inherited member on ‘L pC S .X” ơ ở ấ ớ
Đ kh c ph c vi c này ta dùng t ừ ệ câu l nh khai báo thành ph n đó.
khóa new ngay ể ụ ắ
ệ ầ
T khóa ừ ấ
ụ
new trong tr ợ d u thành ph n k th a đó t ừ ớ ầ ng h p này có tác d ng che l p c s . ơ ở ườ ế ừ
Đ nh nghĩa phiên b n m i trong l p d n xu t ấ
ẫ
ả
ớ
ớ
ị
ng th c c a l p d n xu t mu n truy xu t ươ ấ ấ ố
N u ph ế ế
đ n thành viên X c a l p c s ? ứ ủ ớ ủ ớ ẫ ơ ở
S d ng t ử ụ
khóa base theo cú pháp: base.X ừ
Đ nh nghĩa phiên b n m i trong l p d n xu t ấ
ẫ
ả
ớ
ớ
ị
ể
ể
class Xe { protected int TocDo; //khai báo protected đ có th truy xu t ấ protected string BienSo; protected string HangSX; public Xe(int td, string bs, string hsx) { TocDo = td; BienSo = bs; HangSX = hsx; } public void Xuat() { Console.Write("Xe: {0}, Bien so: {1}, Toc do: {2} kmh",HangSX, BienSo,TocDo); } }
Đ nh nghĩa phiên b n m i trong l p d n xu t ấ
ẫ
ả
ớ
ớ
ị
ủ ớ
ơ ở
ọ
class XeHoi: Xe { int SoHanhKhach; public XeHoi(int td, string bs, string hsx, int shk): base(td, bs, hsx) { SoHanhKhach = shk; } public new void Xuat() { base.Xuat(); //g i hàm Xuat() c a l p c s Console.WriteLine(", {0} cho ngoi", SoHanhKhach); } }
Tham chi u thu c l p c s
ộ ớ
ơ ở
ế
M t tham chi u thu c l p c s có th tr đ n m t
ể ỏ ế ộ
Nh ng nó ch đ
ộ đ i t ố ượ ơ ở ng thu c l p d n xu t ấ ế ộ ớ ộ ớ ẫ
ỉ ượ ế
c khai báo trong l p c s ư ph n đ ầ ượ c phép truy c p đ n các thành ậ ơ ở ớ
Tham chi u thu c l p c s
ộ ớ
ơ ở
ế
K t qu ả ế khi g i ọ h.Xuat() ???
public static void Main() { XeHoi c = new XeHoi(150,"49A-4444", "Toyota", 24); c.Xuat(); Console.WriteLine(); Console.WriteLine("Tham chieu cua lop co so Xe co the tro den doi tuong thuoc lop dan xuat XeHoi"); Console.WriteLine("Nhung chi co the goi ham xuat tuong ung voi Xe"); Xe h = c; h.Xuat(); Console.ReadLine(); }
ĐA HÌNH (polymorphism)
Đa hình là gì?
ử
Đ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.
ệ
Đa hình là ý t cho nhi u ph ph
ng “s d ng m t giao di n chung ộ ng th c khác nhau”, d a trên ề ử ụ ứ ự
ng th c o (virtual method). ưở ươ ứ ả ươ
Đa hình là gì?
Telephone Company
Ring()
Ring()
Ring()
Be e p
T r ing T r ing
vr o oom
Đi u ki n cài đ t tính đa hình ặ
ề
ệ
Đ th c hi n đ ệ c sau: ướ
c tính đa hình ta ph i th c hi n ể ự ượ ự ệ ả
ng th c o b ng t
khóa
ơ ở
ấ
ớ
ươ
ứ ả
ằ
ừ
các b L p c s đánh d u ph
virtual
ớ
ẫ
ươ
ng th c o này ứ ả
i ph ạ override)
khóa
Các l p d n xu t đ nh nghĩa l ằ
(đánh d u b ng t ấ
ấ ị ừ
L u ý: ư
các thành viên (member fields), thu c tính
c khai
ộ (properties) và hàm tĩnh (static) thì không đ ượ báo virtual
Ví d tính đa hình 10’
ụ
ơ ở
ớ
Ví d : Xây d ng 3 l p: ớ L p ớ Tau là l p c s L p ớ TauChien và TauChoHang là l p d n xu t t
ẫ
ớ
ấ ừ
l p Tau ớ
ự ụ
Ví d tính đa hình 10’
ụ
class Tau {
public virtual void LayThongtin()
{
Console.WriteLine(“Day la chiec Tau”);
}
}
class TauChien:Tau {
class TauChoHang:Tau {
public override void LayThongTin()
public override void LayThongTin()
{
{
Console.WriteLine(“Day la tau
Console.WriteLine(“Day la tau
Chien”);
Cho Hang”);
}
}
}
}
Ví d tính đa hình 10’
ụ
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();
Day la chiec Tau Day la tau Chien Day la tau Cho Hang
}
}
LỚP TRỪU TƯỢNG (Abstract class)
L p tr u t
ng
ừ ượ
ớ
Trong ph
ứ ả t ớ i ph ng ấ ng th c o (virtual method): l p d n ế ph i đ nh nghĩa l ẫ ươ ả ị ạ
Trong l p tr u t ớ
ươ xu t ấ không nh t thi th c o ứ ả
ộ
ng ơ ở ươ
ươ c g i là ph ng ng th c tr u t ứ ừ ượ ươ ứ
ể b t bu c ng (abstract class): Đ ừ ượ ắ t i t cấ ả các l p d n xu t ph i đ nh nghĩa l ấ ẫ ạ ả ị ớ ng th c c a l p c s và ph (override) ph ứ ủ ớ th c đó đ ọ ượ (abstract method)
L p tr u t
ng
ừ ượ
ớ
L p tr u t
ng có t khóa abstract tr class ừ ượ ớ ừ c t ướ ừ
VD: abstract class Tau { }
Trong ph n thân c a ph ầ
ng ủ ừ ượ
ẫ
ầ ỉ
ng th c tr u t ứ ươ không có câu l nh nào (ch xây d ng khuôn m u), ự ỉ ệ t c là nó ch có ph n khai báo. ứ Ph c đ t trong l p ng ph i đ ng th c tr u t ứ ừ ượ ả ượ ặ ớ
ng ươ tr u t ừ ượ
L p tr u t
ng
ừ ượ
ớ
Không th t o ra đ i t ng (abstract class)
ng (new) t l p tr u ể ạ ố ượ ừ ớ ừ
Cú pháp ph
t ượ
ng: ươ ng th c tr u t ứ ừ ượ
public abstract void TênPh ươ ngTh c( ); ứ
// ho cặ
abstract public void TênPh ươ ngTh c( ); ứ
Ví d l p tr u t
ng 10’
ụ ớ
ừ ượ
ơ ở
ớ
Ví d : Xây d ng 3 l p: ớ L p ớ Tau là l p c s L p ớ TauChien và TauChoHang là l p d n xu t t
ẫ
ớ
ấ ừ
l p Tau ớ
ự ụ
Ví d tính đa hình 10’
ụ
abstract class Tau {
public abstract void LayThongtin();
// Không làm gì cả
}
class TauChien:Tau {
class TauChoHang:Tau {
public override void LayThongTin()
public override void LayThongTin()
{
{
Console.WriteLine(“Day la tau
Console.WriteLine(“Day la tau
Chien”);
Cho Hang”);
}
}
}
}
Ví d tính đa hình 10’
ụ
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();
Day la tau Chien Day la tau Cho Hang
}
}
L p tr u t
ng
ừ ượ
ớ
ng th c đa hình v i ph ng ươ ứ ớ ươ ữ
S khác nhau gi a ph ừ ượ
ng th c đa hình ph n thân đ
ươ
ượ
l p d n xu t có th thay đ i ph
c đ nh nghĩa ng
ứ ở ớ
ầ ấ
ể
ẫ
ị ổ
ươ
ng:
ứ Ph
ươ
ng th c tr u t ứ
ừ ượ
ầ
c cài đ t trong ph
ượ
ng ph n thân không đ ứ ặ
c đ nh ị ượ ng th c c a l p ủ ớ
ươ
nghĩa và nó đ d n xu t. ấ
ẫ
ự th c tr u t ứ Ph t ng quát, ổ th c đó.
L p tr u t
ng
ừ ượ
ớ
Phân bi
override dùng đ đ nh nghĩa l
ạ
ứ ả
ừ
c dùng v i
ể ị ặ ơ ở
i (ghi đè) ng th c tr u ứ ớ ượ
T khóa ừ ph ng th c o (virtual) ho c ph ươ ươ t ng (abstract) c a l p c s , nó đ ượ ủ ớ m c đích đa hình. ụ T khóa
ừ
new đ che d u thành viên c a l p c s ơ ở
ể
ấ
trùng tên v i thành viên c a l p d n xu t.
ủ ớ
ẫ
ớ
ủ ớ ấ
t gi a t khóa new và override ệ ữ ừ
L p niêm phong
ớ
L p niêm phong (sealed class) không cho phép các l p
ớ
d n xu t k th a t
nó.
ớ ẫ
ấ ế ừ ừ
Đ khai báo m t l p niêm phong ta dùng t
khóa
ể
ừ
ộ ớ c khai báo c a l p không cho phép d n
ủ ớ
ặ ướ
ẫ
sealed đ t tr xu t. ấ
ng đ
ầ
ượ
ớ
ấ sealed nh m ằ
H u h t các l p th ế ặ
c đánh d u ườ ngăn ch n các tai n n do k th a gây ra. ạ
ế ừ
sealed class SinhVien {
//mã l nh ệ
}
L p trong l p
ớ
ớ
Chúng ta có th đ nh nghĩa m t l p bên trong các l p
ộ ớ
ể ị
ớ
khác. Các l p đ
ớ
ượ
ọ
c g i đ n gi n là l p ngoài.
c đ nh nghĩa bên trong g i là các l p l ng ọ ơ
ớ ồ ớ
ị ớ
ứ
ả
(nested class), l p ch a đ ượ Nh ng l p l ng bên trong có l
i là có kh năng truy c p
ớ ồ
ậ
ả t c các thành viên c a l p ngoài.
ợ ủ ớ
ế ấ ả
ng th c c a l p l ng có th truy c p đ n bi n
ữ đ n t M t ph ộ
ươ
ứ
ể
ế
ế
ậ
thành viên private c a l p ngoài.
ủ ớ ồ ủ ớ
L p trong l p
ớ
ớ
tenlop = "TH1"; chuyennganh = "Tin hoc quan ly";
private string tensv; public SinhVien() {
tensv = "Nguyen Van An";
public class LopHoc { private string tenlop; private string chuyennganh; public LopHoc() { } class SinhVien {
}
L p trong l p
ớ
ớ
public void HienThi(LopHoc lop)
{ Console.WriteLine("Thong tin sinh vien"); Console.WriteLine("Ten sinh :"+tensv); Console.WriteLine("Ten lop :"+lop.tenlop); Console.WriteLine("Chuyen nganh :" + lop.chuyennganh);
}
} }
L p trong l p
ớ
ớ
class Program { static void Main(string[] args) { LopHoc lop = new LopHoc(); LopHoc.SinhVien sv = new LopHoc.SinhVien(); sv.HienThi(lop); } }
GIAO DIỆN (Interface)
Giao di nệ
ướ
ệ
ả
ả
ớ
hay các c u trúc s th c hi n m t đi u gì đó.
Giao di n là ràng bu c, giao ệ
ộ ẽ ự
c đ m b o cho các l p ộ
ề
ấ
ự
ệ
t r ng l p này có h tr các ph
ớ ỗ ợ
ươ
ầ
ộ ế ằ ự ệ
ỉ ụ
ứ
Khi m t l p th c thi m t giao di n, thì l p này báo cho ộ ớ các thành ph n bi ng ớ th c, thu c tính, s ki n và các ch m c khai báo trong ộ giao di n.ệ
M t giao di n gi ng nh m t l p ch ch a các ph
ng
ư ộ ớ
ứ
ỉ
ươ
ố ng.
th c tr u t
ệ ừ ượ
ộ ứ
ệ l p này ph i th c
ự
ộ
ớ
ự ộ ớ t c các ph
ả ệ Đây là m t ộ
Khi m t l p th c thi m t giao di n, thi t ng th c c a giao di n ươ b t bu c mà các l p ph i th c hi n. ớ ắ
ấ ả ộ
ứ ả
ủ ự
ệ
Đ nh nghĩa giao di n
ệ
ị
Cú pháp đ đ nh nghĩa m t giao di n nh sau:
ư
ệ
ộ
ể ị
ậ interface
ổ ừ
ệ
[b t {
ệ
ầ
}
Trong đó: B t
truy c p: public, private, protected, internal, và protected
ậ
ổ ừ internal.
khóa interface, tên giao di n th
ng
ừ
ệ
ườ
b t đ u b ng ch I hoa (không b t bu c).
Tên giao di n theo sau t ệ ằ
ắ ầ
ữ
ắ
ộ
Danh sách c s là danh sách các giao di n mà giao di n này
ơ ở
ệ
ệ
m r ng. ở ộ
Đ nh nghĩa giao di n
ệ
ị
public interface ITaiKhoan {
void GuiTien(decimal soLuong); bool RutTien(decimal soLuong); decimal SoTien { get; }
}
Th c thi giao di n
ự
ệ
public class TaiKhoanTietKiem: ITaiKhoan {
private decimal soTien; public bool RutTien(decimal soLuong) {
if (soTien >= soLuong) { soTien -= soLuong; return true;
} Console.WriteLine("Rut tien bi loi. "); return false;
}
Th c thi giao di n
ự
ệ
public void GuiTien (decimal soLuong) {
soTien += soLuong;
} public decimal SoTien {
get { return soTien; }
}
}
L u ý:
Không đ
c b qua b t kỳ ph
ư
ượ
ỏ
ấ
ươ
ng th c nào ứ
Th c thi nhi u giao di n ề
ự
ệ
public interface ITinhtoan
{
long Tinh(int a, int b);
} public interface IKetqua {
void Ketqua(int a, int b);
}
Th c thi nhi u giao di n ề
ự
ệ
public class Tinhtoans: ITinhtoan,IKetqua
{
public long Tinh(int a, int b) {
a++; b++; return (a+b);
} public void Ketqua(int a, int b) {
Console.WriteLine("a=" +a); Console.WriteLine("a=" +b);
}
}
Bài th c hành 1
ự
Xây d ng m t l p HinhHoc, k th a l p HinhHoc đó ế ừ ớ ự
ữ
ộ ớ đ tính di n tích cho các hình: ệ ể Hình tròn Hình ch nh t ậ
Bài th c hành 2
ự
Xây d ng l p Nguoi g m có các thành ph n sau: ồ
ự
ầ
ớ
ươ
ươ ứ
ng th c: ứ ở ạ
ng th c kh i t o không có tham s . ố
ươ
ng th c kh i t o có 3 tham s . ố
ở ạ
ứ
H tênọ Ngày sinh Quê quán Và các ph Ph Ph Ph
ng th c cho phép nh p các thông tin v H tên, ngày
ề ọ
ươ
ứ sinh, Quê quán c a ng
ậ i đó.
ủ
ườ
Ph
ng th c cho phép hi n th các thông tin c a ng
i đó ra
ủ
ứ
ể
ị
ườ
ươ màn hình.
Bài th c hành 2
ự
Xây d ng l p SinhVien k th a t
l p Nguoi g m có
ế ừ ừ ớ
ự
ớ
ồ
ộ
ủ ớ
ng th c:
ươ
ứ
các thu c tính sau: Các thu c tính c a l p Nguoi ộ Mã sinh viên L pớ Và các ph ở ạ
ở ạ
Kh i t o không có tham s . ố Kh i t o có 5 tham s . ố Nh p các thông tin v H tên, ngày sinh, Quê quán, Mã Sinh
ề ọ
ậ
viên, L p c a sinh viên đó.
ủ
ớ
Hi n th các thông tin c a sinh viên đó ra màn hình. ủ
ể
ị
Bài th c hành 3
ự
Xây d ng l p NhanVien k th a l p Nguoi
bài 1 g m
ế ừ ớ
ở
ồ
ự
ủ ớ
ng
ệ ố ươ
ng c b n
ơ ả
L
ng = H s l
ng * L
ng c b n (1 + ph c p).
ươ
ệ ố ươ
ươ
ơ ả
ụ ấ
ng th c:
ứ
ớ có các thu c tính sau: ộ Các thu c tính c a l p Nguoi ộ H s l L ươ Ph c p ụ ấ Và các ph ở ạ
ố
ở ạ
ố
ủ
ậ
ng c a nhân viên đó.
ươ
ươ Kh i t o không có tham s Kh i t o có 7 tham s Nh p các thông tin c a nhân viên đó. Tính l ủ Hi n th thông tin c a nhân viên
ủ
ể
ị