Mục lục bài viết
Nội dung
- Khái niệm kế thừa
- Khái niệm đa hình
- Giao diện (interface)
Kế thừa là gì?
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
Ví dụ: Windows form
Ví dụ: Một lớp con có thể là lớp cha của các lớp khác
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
Trong 1 mô tả dự án thực tế làm sao phát hiện được mô hình lớp mà ở đó có tính kế thừa?
Cần nắm được khái niệm Tổng quát hóa? chuyên biệt hóa?
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
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() {…}
Overriding Methods
Trong một tập các lớp có mối quan hệ huyết thống có các phương thức giống signature y xì (nội dung phương thức khác nhau)
Overriding methods giúp lập trình viên có thể định nghĩa cách hành xử khác nhau ứng với các đối tượng khác nhau nhưng cùng sử dụng một tên phương thức.
Ví dụ: Nhân viên chính thức và Nhân viên thời vụ đều có phương thức là Tính Lương, tuy nhiên cách thức tính lương của 2 đối tượng này sẽ khác nhau.
Ví dụ mô hình lớp NhanVien có phương thức tính lương.
Đ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
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
Đa hình được tạo nên từ 2 trường hợp:
- Trường hợp 1: Từ kế thừa
- Trường hợp 1: Từ kế thừa
- Trường hợp 2: Từ Interface
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; } }
- 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
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); }
- 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; } }
- 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; } }
- 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”));
}
Kết quả
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ả
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;
}
}
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; } } } }
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));
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
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
31/03/2022 Ứng Dụng Miễn Phí