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 [:danh sách c s ] truy c p] ơ ở

ổ ừ

[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