KKếế ththừừa a ((inheritance) inheritance)
Xây dựựng lng lớớp p Xây d Xây dựng lớp ccóó ttíính knh kếế ththừừaa có tính kế thừa
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
1 1
KhKháái ni a trong C# i niệệm km kếế ththừừa trong C#
(cid:190)(cid:190)KKếế ththừừa la làà cơ ch cơ chếế cho ph cho phéép đp địịnh ngh nh nghĩĩa ma mộột t
p cha) llớớp mp mớới (ki (kếế ththừừa ta từừ llớớp cha)
c thuộộc tc tíính vnh vàà ccáác c (cid:190)(cid:190)Sau đ xây dựựng thêm c
Sau đóó xây d phương thứức riêng c phương th ng thêm cáác thu c riêng củủa la lớớp đp đóó..
(cid:190)(cid:190)LLớớp cha trong s p cha trong sựự kkếế ththừừa đưa đượợc gc gọọi li làà llớớp p
(base class) cơ scơ sởở (base class)
(cid:190)(cid:190)LLớớp con trong s p con trong sựự kkếế ththừừa đưa đượợc gc gọọi li làà llớớp p
t (derived class) ddẫẫn xun xuấất (derived class)
cơ sở
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
2
(cid:190)(cid:190)Derived class Derived class có hầu hết các thành phần ???? trừ lớp giống như private,constructor, static, destructor
KhKháái ni a trong C# i niệệm km kếế ththừừa trong C#
(cid:190)Quan hệ “là 1”: Kế thừa được sử dụng thông dụng nhất để biểu diễn quan hệ "là 1" VD: (cid:137) Một sinh viên là một con người (cid:137) Một tam giác là một đa giác
(cid:137) Để phản ánh mối quan hệ giữa các lớp (cid:137) Để phản ánh sự chia sẻ mã chương trình
(cid:190)Kế thừa thường được dùng theo 2 cách:
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
3
giữa các lớp
KhKháái ni a trong C# i niệệm km kếế ththừừa trong C#
Mã lệnh
bị trùng
(cid:190)Lớp Con Chó: (cid:137) Có chân (cid:137) Có mắt (cid:137) Có đuôi (cid:190)Lớp Con Gà: (cid:137) Có chân (cid:137) Có mắt (cid:137) Có cánh
Mã lệnh
bị trùng
(cid:137) Biết chạy (cid:137) Biết ngủ (cid:137) Biết sủa (cid:137) Biết vẫy đuôi
(cid:137) Biết chạy (cid:137) Biết ngủ (cid:137) Biết bay (cid:137) Biết vẫy cánh
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
4
(cid:190) Lớp động vật: (cid:137) Có chân (cid:137) Có mắt
(cid:137) Biết chạy (cid:137) Biết ngủ
(cid:190) Lớp Con Gà: (cid:137) Có cánh
(cid:190) Lớp Con Chó: (cid:137) Có đuôi
(cid:137) Biết bay (cid:137) Biết vẫy cánh
(cid:137) Biết sủa (cid:137) Biết vẫy đuôi
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
5
KhKháái ni a trong C# i niệệm km kếế ththừừa trong C#
Syntax Syntax
// Thân lớp con
// Thân lớp dẫn xuất
// body of derived class
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
6
(cid:190)Cú pháp định nghĩa lớp dẫn xuất (lớp con): class TênLớpCon : TênLớpCha { } Hoặc class TênLớpDẫnXuất : TênLớpCơSở { } class DerivedClass: BaseClass { }
VDVD
// Lớp cơ sở Point2D
class Point2D {
public int x,y; public void Xuat2D() {
Console.WriteLine("({0}, {1} )", x, y);
}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
7
}
VDVD
// Lop dan xuat Point3D ke thua tu lop Point2D
class Point3D:Point2D {
public int z; public void Xuat3D() {
Console.WriteLine("({0}, {1} , {2})", x, y, z);
}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
8
}
VDVD
public static void Main() {
Point2D p2 = new Point2D(); p2.x = 1; p2.y = 2; p2.Xuat2D();
// ?
Point3D p3 = new Point3D(); p3.x = 4; p3.y = 5; p3.z = 6; p3.Xuat3D(); p3.Xuat2D(); // ? Console.ReadLine();
}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
9
VD:VD:
Xây dựng Person class và Student class ?
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
10
GGọọi Constructor c i Constructor củủa la lớớp Cơ s p Cơ sởở
(cid:190)Vì lớp dẫn xuất không thể kế thừa phương Constructor) của lớp cơ sở thức tạo lập (Constructor nên một lớp dẫn xuất phải thực thi phương thức tạo lập riêng của mình.
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
11
(cid:190)Nếu lớp cơ sở có một phương thức tạo lập mặc định (tức là không có phương thức tạo lập hoặc phương thức tạo lập không có tham số) thì phương thức tạo lập của lớp dẫn xuất được định nghĩa như cách thông thường.
GGọọi Constructor c i Constructor củủa la lớớp Cơ s p Cơ sởở
(cid:190)Nếu lớp cơ sở có phương thức tạo lập có tham số thì lớp dẫn xuất phải định nghĩa phương thức tạo lập có tham số theo cú pháp sau:
TênLớpCon(ThamSốLớpCon):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
}
/Note: giáo trình Tr. 42 ghi nhầm cú pháp
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
12
VDVD
// 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);
}
}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
13
VDVD
// 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);
}
}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
14
VDVD
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();
}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
15
ĐĐịịnh ngh nh nghĩĩa la lạại phương th i phương thứức cc củủa la lớớp dp dẫẫn xun xuấấtt
(cid:190)T.H derived class có property or method trùng tên với base class thì trình biên dịch sẽ có cảnh báo dạng như sau:
“keyword new is required on ‘LớpDẫnXuất.X’ because it
hides inherited member on ‘LớpCơSở.X ‘”.
(cid:190)Để khắc phục việc này ta dùng từ khóa new
ngay câu lệnh khai báo thành phần đó.
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
16
(cid:190)Từ khóa new trong T.H này có tác dụng che dấu thành phần kế thừa đó đối từ base class.
ĐĐịịnh ngh nh nghĩĩa la lạại phương th i phương thứức cc củủa la lớớp dp dẫẫn xun xuấấtt
(cid:190)Nếu phương thức của derived class muốn truy cập đến thành phần X của base class ?
(cid:190)Sử dụng từ khóa base theo cú pháp:
base.X
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
17
vd trang 45 vd trang 45
Tham chiếếu thu Tham chi c base class u thuộộc base class
(cid:190)Một tham chiếu thuộc base class có thể trỏ đến một đối tượng thuộc derived class
(cid:190)Nhưng nó chỉ được phép truy cập đến các thành phần được khai báo trong lớp cơ sở
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
18
vd trang 47 vd trang 47
MMứức đc độộ truy c
truy cậập cp củủa la lớớp dp dẫẫn xun xuấấtt
Access Modifier Access Modifier Access Modifier Of Derived class Of Derived class Of Derived class
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
19 19
MMứức đc độộ truy c truy cậập cp củủa la lớớp dp dẫẫn xun xuấấtt
(cid:190)(cid:190)ĐiĐiềều khi n quyềền truy xu
n truy xuấất cho
p truy xuấất thu
n truy xuấất dt dùùng đng đểể ggáán n u khiểển quy t cho thuthuộộc tc tíính nh hohoặặc c quyquyềền truy xu ng hay từừ llớớp p phương thứức c ttừừ đ đốối tưi tượợng hay t phương th t thuộộc c ddẫẫn xun xuấất ct cóó đư đượợc phc phéép truy xu ttíính nh ởở llớớp mp màà nnóó đư đượợc khc kháái bi bááo hay o hay không. không.
a thườờng d ng dùùng l : public,, ng làà: public
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
20
(cid:190)(cid:190)CCáác tc từừ khkhóóa thư protected private,, protected private
MMứức đc độộ truy c truy cậập cp củủa la lớớp dp dẫẫn xun xuấấtt
Access Modifier Access Modifier QuyQuyềền hn hạạnn
public public Công cộộng, ng, không gi Công c không giớới hi hạạnn
c truy xuấất t private private Riêng tư, , chchỉỉ đư đượợc truy xu Riêng tư thôi trong nộội bi bộộ ccủủa la lớớp đp đóó mmàà thôi trong n
c truy xuấất t
protected protected p con (lớớp dp dẫẫn xun xuấất) kt) kếế ththừừa ta từừ
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
21
ĐưĐượợc bc bảảo vo vệệ, , chchỉỉ đư đượợc truy xu trong nộội bi bộộ ccủủa la lớớp đp đóó vvàà ccáác c trong n llớớp con (l llớớp đp đóó
VD:VD:
TauChien:Tau class TauChien:Tau class
{ { class TauTau class {{
// private or protected // private or protected nhienlieu = 0; public intint nhienlieu = 0; public
void Chay() public void Chay() public {{
nhienlieu = 20; nhienlieu = 20;
}} Chay() public voidvoid Chay() public {{
nhienlieu = 10; nhienlieu = 10;
}} }}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
22
}}
VD:VD:
class Program { Program { class Main(string[] args) static void Main(string[] args) static void {{
Tau(); Tau a = newnew Tau(); Tau a = a.Chay(); a.Chay(); .WriteLine(a.nhienlieu); Console.WriteLine(a.nhienlieu); Console TauChien b = new TauChien(); TauChien b = new TauChien(); b.Chay(); b.Chay(); .WriteLine(b.nhienlieu); Console.WriteLine(b.nhienlieu); Console
}}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
23
} } o private or protected ? // nhienlieu of Tau class khai bááo private or protected ? // nhienlieu of Tau class khai b
Q&AQ&A
i giảảngng
p trong GT i VD & bàài ti tậập trong GT
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
24 24
BBàài ti tậập:p: 1.1. Đ Đọọc lc lạại bi bàài gi 2. L2. Lààm cm cáác bc bàài VD & b 3.3. Đ Đọọc bc bàài: i: KKếế ththừừaa 4. Buổổi ti tớới thi thảảo luo luậận & ki 4. Bu n & kiểểm tra b m tra bàài ci cũũ