Bài giảng Hệ thống mã nguồn mở - Chương 5: Kế thừa và đa hình
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ thống mã nguồn mở - Chương 5: Kế thừa và đa hình", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_he_thong_ma_nguon_mo_chuong_5_ke_thua_va_da_hinh.pptx
Nội dung text: Bài giảng Hệ thống mã nguồn mở - Chương 5: Kế thừa và đa hình
- Chương 5 Kế thừa và đa hình
- Nội dung ❖Khái niệm kế thừa ❖Khái niệm đa hình ❖Giao diện (interface)
- Kế thừa ❖Các đối tượng có cùng chung một số đặc điểm, hành vi được nhóm lại với nhau ❖Ví dụ ▪ Xe đạp ▪ Xe máy ▪ Xe hơi ▪ Xe tải ▪ ➔ Phương tiện giao thông
- Kế thừa ❖Ví dụ: Windows form
- Kế thừa ❖Tạo ra các lớp mới từ việc sử dụng lại những thành phần của lớp đã có ❖Lợi ích ▪ Nhất quán ▪ Thuận tiện ▪ Tái sử dụng code
- Khai báo kế thừa ❖Lớp cơ sở (base class): làm cơ sở để các lớp khác kế thừa ❖Lớp nhận (derived class): kế thừa đặc điểm của lớp cơ sở ❖Khai báo ▪ class LopNhan : LopCoSo ▪ Ví dụ: • class XeDap : PhuongTienGiaoThong • class XeMay : PhuongTienGiaoThong
- Constructor ❖Không được kế thừa ❖Lớp con truy cập bằng từ khóa base class HinhHoc { public HinhHoc(double chuVi, double dienTich) { ChuVi = chuVi; DienTich = dienTich; } } class HinhTron : HinhHoc { public HinhTron(double chuVi, double dienTich) : base(chuVi, dienTich) { } }
- Từ khóa base ❖Dùng để truy cập đến thành phần của lớp cơ sở ❖Mức truy cập: ▪ public ▪ protected ❖Khai báo class { (list_of_argument){ } } class : { base. ( ); }
- Từ khóa new ❖Dùng để khai báo phương thức ở lớp nhận khi đã có phương thức cùng tên ở lớp cơ sở ❖Ví dụ ▪ public new void TinhDienTich() { }
- Đa hình ❖Lớp nhận kế thừa từ lớp cơ sở và có thêm những đặc tính riêng biệt ❖Từ khóa: ▪ virtual • Khai báo trong lớp cơ sở, cho biết thành phần đó có thể được nạp chồng ▪ override • Khai báo trong lớp nhận, cho biết thành phần đó được nạp chồng
- Đa hình ❖Khi tham chiếu đến đối tượng: ▪ Nếu đối tượng là lớp cơ sở → phương thức virtual của lớp cơ sở được thực hiện ▪ Nếu đối tượng là lớp nhận → phương thức override của lớp nhận được thực hiện
- Ví dụ đa hình class HinhHoc { public virtual void TinhDienTich() { Console.WriteLine("Dien tich " + loaiHinh); } } class HinhTron : HinhHoc { public override void TinhDienTich() { base.TinhDienTich(); DienTich = BanKinh * BanKinh * Math.PI; } }
- Ví dụ đa hình ❖HinhHoc hh = new HinhHoc(); ❖//TinhDienTich cua lop HinhHoc ❖hh.TinhDienTich(); ❖HinhHoc htr = new HinhTron(); ❖//TinhDienTich cua lop HinhTron ❖htr.TinhDienTich();
- Giao diện (Interface) ❖Interface là một giao ước, khi một lớp thực hiện inteface thì phải tuân theo đúng những gì interface đó mô tả ❖Thành phần ▪ Property ▪ Method ▪ Event
- Interface ❖Khai báo interface TenInterface { //các thành phần } ❖Mức truy xuất: public ❖Các phương thức chỉ có phần khai báo, không có phần thân
- Ví dụ interface ILamViec { string LamViec(string tenViec); }
- Ví dụ (tt) ❖Lớp SinhVien thực hiện interface ILamViec class SinhVien : ILamViec { public string MSSV { get; set; } public string Nganh { get; set; } public string HoTen { get; set; } public string LamViec(string tenViec) { return "Sinh Vien " + HoTen + " dang " + tenViec; } }
- Ví dụ (tt) ❖Lớp NhanVien thực hiện ILamViec class NhanVien : ILamViec { public string MSNV { get; set; } public string Phong { get; set; } public string HoTen { get; set; } public int HsLuong { get; set; } public virtual int Luong { get { return HsLuong * 800000; } } public string LamViec(string tenViec) { return "NhanVien " + HoTen + " dang " + tenViec; } }
- Ví dụ ❖Thực thi interface static void Main(string[] args) { SinhVien a = new SinhVien(); a.HoTen = "SVA"; NhanVien b = new NhanVien(); b.HoTen = "NVB"; ILamViec lv1 = a; Console.WriteLine(lv1.LamViec("hoc bai")); ILamViec lv2 = b; Console.WriteLine(lv2.LamViec("lam bao cao")); }
- Ví dụ ❖Kết quả
- Interface ❖Interface có thể kế thừa ❖Một lớp có thể thực hiện 1 hoặc nhiều interface ❖Khi thực hiện interface, lớp đó phải thực hiện đầy đủ những thành phần interface đó mô tả
- Ví dụ ❖Interface IQuanTri interface IQuanTri { string GiaoViec(string tenViec, string tenNguoiNhan); } class SinhVien : ILamViec, IQuanTri { // các thành phần khác public string GiaoViec(string tenViec, string nguoiNhan) { return "Sinh vien " + HoTen + " dang giao viec " + tenViec + " cho " + nguoiNhan; } }
- Ví dụ ❖Lớp QuanLy kế thừa NhanVien, thực hiện IQuanTri class QuanLy : NhanVien, IQuanTri { public string LamViec(string tenViec) { return "Quan ly " + HoTen + " dang " + tenViec; } public string GiaoViec(string tenViec, string nguoiNhan) { return "Quan ly " + HoTen + " dang giao viec " + tenViec + " cho " + nguoiNhan; } }
- Ví dụ ❖Thực thi giao diện IQuanTri SinhVien a = new SinhVien(); a.HoTen = "SVA"; NhanVien b = new NhanVien(); b.HoTen = "NVB"; QuanLy c = new QuanLy(); c.HoTen = "QLC"; IQuanTri qt1 = a; Console.WriteLine(qt1.GiaoViec("truc nhat", "SVB")); IQuanTri qt2 = c; Console.WriteLine(qt2.GiaoViec("dat hang", b.HoTen));
- Ví dụ ❖Kết quả
- Kiểm tra thực hiện interface ❖Từ khóa is ▪ True nếu đối tượng thực hiện interface ▪ False nếu đối tượng không thực hiện interface kt = a is IQuanTri; //kt =true kt = b is IQuanTri; //kt =false
- Kiểm tra thực hiện interface ❖Từ khóa as ▪ Thực hiện chuyển đổi sang interface ▪ Nếu đối tượng không thực hiện interface → null IQuanTri qt3 = a as IQuanTri; IQuanTri qt4 = b as IQuanTri; //null