Mất 4 phút đọc

Xây dựng các Lớp kế thừa trong C#

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

5/5 - (3 Bình chọn)
263 lượt xem

31/03/2022 Ứng Dụng Miễn Phí

Bài viết liên quan

Block "5_tab_footer" not found