Xây dựng lớp có tính kế thừa
¾Kếthừa làcơch cơchếcho phép đ p định nghĩa một
lớp mới (kếthừa từlớp cha)
¾Sau đ Sau đóxây dựng thêm các thuộc tính vàcác
phương th phương thức riêng của lớp đ p đó.
¾Lớp cha trong sựkếthừa đư a được gọi làlớp
cơs cơsở(base class)
¾Lớp con trong sựkếthừa đư a được gọi làlớp
dẫn xuất (derived class)
¾Derived class Derived class có hầu hết các thành phần
giống nhưlớp cơsở trừ ????
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com1
Kế thừa (inheritance)
1
Xây dựng lớp
có tính kế thừa
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com2
Khái niệm kế thừa trong C#
¾Kế thừa là cơ chế cho phép định nghĩa một
lớp mới (kế thừa từ lớp cha)
¾Sau đó xây dựng thêm các thuộc tính và các
phương thức riêng của lớp đó.
¾Lớp cha trong sự kế thừa được gọi là lớp
cơ sở (base class)
¾Lớp con trong sự kế thừa được gọi là lớp
dẫn xuất (derived class)
¾Derived class có hầu hết các thành phần
giống như lớp cơ sở trừ ????
private,constructor, static, destructor
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com3
Khái niệm kế thừa trong C#
¾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:
Một sinh viên là một con người
Một tam giác là một đa giác
¾Kế thừa thường được dùng theo 2 cách:
Để phản ánh mối quan hệ giữa các lớp
Để phản ánh sự chia sẻ mã chương trình
giữa các lớp
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
¾Lớp Con Gà:
Có chân
Có mắt
Có cánh
Biết chạy
Biết ngủ
Biết bay
Biết vẫy cánh
¾Lớp Con Chó:
Có chân
Có mắt
Có đuôi
Biết chạy
Biết ngủ
Biết sủa
Biết vẫy đuôi
4
Khái niệm kế thừa trong C#
Mã lệnh
bị trùng
Mã lệnh
bị trùng
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
¾Lớp động vật:
Có chân
Có mắt
Biết chạy
Biết ngủ
5
Khái niệm kế thừa trong C#
¾Lớp Con Gà:
Có cánh
Biết bay
Biết vẫy cánh
¾Lớp Con Chó:
Có đuôi
Biết sủa
Biết vẫy đuôi
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com6
Syntax
¾Cú pháp định nghĩa lớp dẫn xuất (lớp con):
class TênLớpCon : TênLớpCha
{ // Thân lớp con
}
Hoặc
class TênLớpDẫnXuất : TênLớpCơSở
{ // Thân lớp dẫn xuất
}
class DerivedClass: BaseClass
{ // body of derived class
}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com7
VD
// 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.com8
VD
// 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.com9
VD
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.com10
VD:
Xây dựng Person class và Student class ?
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com11
Gọi Constructor của lớp Cơ sở
¾Vì lớp dẫn xuất không thể kế thừa phương
thức tạo lập (Constructor) của lớp cơ sở
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.
¾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.
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com12
Gọi Constructor của lớp Cơ sở
¾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.com13
VD
// 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.com14
VD
// 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.com15
VD
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.com16
Định nghĩa lại phương thức của lớp dẫn xuất
¾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 ‘”.
¾Để 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 đó.
¾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.
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com17
Định nghĩa lại phương thức của lớp dẫn xuất
¾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 ?
¾Sử dụng từ khóa base theo cú pháp:
base.X
vd trang 45
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com18
Tham chiếu thuộc base class
¾Một tham chiếu thuộc base class
có thể trỏ đến một đối tượng thuộc
derived class
¾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ở
vd trang 47
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com19
Mức độ truy cập của lớp dẫn xuất
19
Access Modifier
Of Derived class
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com20
Mức độ truy cập của lớp dẫn xuất
¾Điều khiển quyền truy xuất dùng để gán
quyền truy xuất cho thuộc tính hoặc
phương thức từ đối tượng hay từ lớp
dẫn xuất có được phép truy xuất thuộc
tính ở lớp mà nó được khái báo hay
không.
¾Các từ khóa thường dùng là: public,
private, protected
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com21
Mức độ truy cập của lớp dẫn xuất
Access Modifier Quyền hạn
public Công cộng, không giới hạn
private Riêng tư, chỉ được truy xuất trong nội bộ của lớp đó mà thôi
protected
Được bảo vệ, chỉ được truy xuất
trong nội bộ của lớp đó và các
lớp con (lớp dẫn xuất) kế thừa từ
lớp đó
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
VD:
class Tau
{ // private or protected
public int nhienlieu = 0;
public void Chay()
{
nhienlieu = 10;
}
}
22
class TauChien:Tau
{
public void Chay()
{
nhienlieu = 20;
}
}
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com
VD:
class Program {
static void Main(string[] args)
{
Tau a = new Tau();
a.Chay();
Console.WriteLine(a.nhienlieu);
TauChien b = new TauChien();
b.Chay();
Console.WriteLine(b.nhienlieu);
}
}
// nhienlieu of Tau class khai báo private or protected ?
23
OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com24
Q&A
Bài tập:
1. Đọc lại bài giảng
2. Làm các bài VD & bài tập trong GT
3. Đọc bài: Kế thừa
4. Buổi tới thảo luận & kiểm tra bài cũ
24
File đính kèm:
03_Inheritance.pdf

