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