Tính kế thừa trong C# (Bài 5)

Tính kế thừa trong C# cho phép lập trình viên tạo ra một lớp mới kế thừa một lớp đã tồn tại. Nghĩa là lớp được kế thừa sẽ có tất cả những thuộc tính và phương thức với quyền truy cập không phải private của lớp cha.

Cũng tương tự như tính kế thừa trong Java, C# chỉ hỗ trợ đơn thừa kế (nghĩa là một lớp chỉ được phép kế thừa một lớp khác). Hình bên dưới là một ví dụ về tính kế thừa trong c#, cụ thể khi tạo lớp NhanVien và lớp KhachHang, chúng ta sẽ kế thừa lớp Nguoi.

tinh ke thua trong c# 1

Tính kế thừa trong C# – Mục đích sử dụng

Mục đích của tính kề thừa là để tái sử dụng những thuộc tính và phương thức phổ biến trong một lớp mà không cần phải tạo ra chúng. Xem xét ví dụ bên dưới.

Yêu cầu tạo 2 lớp nhân viên và khách hàng có các thuộc tính và phương thức như hình

tinh ke thua trong c# 2

Chúng ta nhận thấy rằng giữa 2 lớp này có 4 thuộc tính (tên, địa chỉ, email, số điện thoại) và 2 phương thức(hiển thị thông itn, nhập thông tin) giống nhau. Vì vậy, chúng ta sẽ tạo ra một lớp mới trong những thuộc tính và phương thức này.

tinh ke thua trong c# 3

Tính kế thừa trong C# – Cài đặt kế thừa

Tại lớp được kế thừa, chèn dấu hai chấm sau tên lớp và theo sau dấu hai chấm là lớp cha (lớp cơ sở). Lúc này lớp được kế thừa (lớp dẫn xuất) sẽ thừa kế những thuộc tính và phương thức không phải private (non-private) của lớp cha. Bên dưới là cú pháp được sử dụng để kế thừa trong C#.

Tên_Lớp_Con:Tên_Lớp_Cha

Ví dụ: Cho phép lớp NhanVien kế thừa lớp Nguoi

class NhanVien:Nguoi
{

}

Tính kế thừa trong C# – Phương thức khởi tạo

Tại lớp cha (lớp cơ sở) có định nghĩa phương thức khởi tạo (constructor) có tham số thì tại các lớp dẫn xuất (lớp con hay lớp được kế thừa) phải gọi phương thức khởi tạo của lớp cha. Bên dưới là một ví dụ

Xây dựng lớp Nguoi

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication.lesson05
{
 class Nguoi
 {
  // Khai báo thuộc tính
  public string maso;
  public string hoten;
  public string gioitinh;
  // Phương thức khởi tạo có 4 tham số
  public Nguoi(string maso, string hoten, string gioitinh)
  {
    this.maso = maso;
    this.hoten = hoten;
    this.gioitinh = gioitinh;
  } 
 }
}

Xây dựng lớp NhanVien kế thừa lớp Nguoi

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication.lesson05
{
 class NhanVien:Nguoi
 {
   private string bangcap;

   public NhanVien(string maso, string hoten, string gioitinh, string bangcap)
   : base(maso, hoten, gioitinh)
   {
     this.bangcap = bangcap;
   }
 }
}

Tính kế thừa trong C# – Overriding cho method

Là một tính năng cho phép lớp con định nghĩa lại phương thức của lớp cha. Phương thức được khai báo ở lớp con phải cùng tên, cùng tham số mà lớp cha đã khai báo.

Trong C#, để thực hiện điều này thì những phương thức cho phép lớp con overriding phải chỉ định từ khoá virtual. Và tại những lớp con phải chỉ định từ khoá override khi muốn định nghĩa lại xử lý cho phương thức. Hãy xem xét ví dụ sau:

Tại lớp cha (lớp Nguoi)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication.lesson05
{
 class Nguoi
 {
  // Khai báo thuộc tính
  public string maso;
  public string hoten;
  public string gioitinh;

  public Nguoi(string maso, string hoten, string gioitinh)
  {
   this.maso = maso;
   this.hoten = hoten;
   this.gioitinh = gioitinh;
  } 

  public virtual void Nhap()
  {
   Console.Write("Nhap ma so: ");
   maso = Console.ReadLine();

   Console.Write("Nhap ho ten: ");
   hoten = Console.ReadLine();

   Console.Write("Nhap gioi tinh: ");
   gioitinh = Console.ReadLine();
  }

  public virtual void HienThi()
  {
   Console.WriteLine("Ma so: {0}, Ho ten: {1}, Gioi tinh: {2}", maso, hoten, gioitinh);
  }
 }
}

Tại lớp con (lớp NhanVien)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication.lesson05
{
 class NhanVien:Nguoi
 {
  private string bangcap;

  public NhanVien(string maso, string hoten, string gioitinh, string bangcap)
   : base(maso, hoten, gioitinh)
  {
   this.bangcap = bangcap;
  }

  public override void Nhap()
  {
    base.Nhap(); // Gọi phương thức của lớp Nguoi
    // Thêm xử lý cho thuộc tính bằng cấp
    Console.Write("Nhap thong tin bang cap: ");
    bangcap = Console.ReadLine();
  }

  public override void HienThi()
  {
   base.HienThi();
   Console.WriteLine("Bang cap: {0}", bangcap);
  }
 }
}

Tính kế thừa trong C# – Từ khoá Sealed

Một lớp được chỉ định với từ khoá sealed là một lớp không cho phép kế thừa. Một phương thức được chỉ định với từ khoá sealed là một phương thức không cho overriding.

Cú pháp khai báo lớp sealed

sealed class Class_Name
{
 //body of the class
}

Cú pháp khai báo phương thức sealed

access_modifier sealed override return_type Method_Name
{
 //body of the method
}

Ví dụ khai báo phương thức sealed

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication.lesson05
{
 class NhanVien:Nguoi
 {
  private string bangcap;

  public NhanVien(string maso, string hoten, string gioitinh, string bangcap)
   : base(maso, hoten, gioitinh)
  {
   this.bangcap = bangcap;
  }

  // Phương thức này không được phép overriding ở lớp con
  public sealed override void Nhap()
  {
   base.Nhap(); // Gọi phương thức của lớp Nguoi
   // Thêm xử lý cho thuộc tính bằng cấp
   Console.Write("Nhap thong tin bang cap: ");
   bangcap = Console.ReadLine();
  }

  public override void HienThi()
  {
   base.HienThi();
   Console.WriteLine("Bang cap: {0}", bangcap);
  }
 }
}

Tính kế thừa trong C# – Bài tập thực hành

Xây dựng chương trình quản lý nhân sự trong một công ty. Chương trình phải có các chức năng như: quản lý thông tin nhân viên (mã nhân viên, tên nhân viên, giới tính, bằng cấp, ngày sinh) và thông tin khách hàng (mã khách hàng, tên khách hàng, giới tính, ngày sinh, loại khách hàng).

Chương trình cho phép người dùng lựa chọn thao tác thông qua menu

  • Thêm nhân viên (nhập: ae)
  • Thêm khách hàng (nhập: ac)
  • Hiển thị thông tin nhân viên (nhập: dae)
  • Hiển thị thông tin khách hàng (nhập: dac)
  • Thống kê khách hàng (nhập: cs)
  • Thoát chương trình (nhập: ea)

Khi người dùng nhập “ae”:

  • Yêu cầu người dùng nhập tên nhân viên, giới tính, ngày sinh và bằng cấp. Lưu ý mã nhân viên sẽ được phát sinh tự động theo qui tắc là e1, e2, …
  • Giới tính chỉ được phép nhập nam hoặc nữ.
  • Bằng cấp chỉ được phép nhập trung cấp, cao đẳng hoặc đại học.
  • Ngày sinh phải có độ dài là 10

Khi người dùng nhập “ac”:

  • Yêu cầu người dùng nhập tên khách hàng, giới tính, ngày sinh và loại khách hàng. Lưu ý mã khách hàng sẽ được phát sinh tự động theo qui tắc là c1, c2, …
  • Giới tính chỉ được phép nhập nam hoặc nữ.
  • Loại khách hàng chỉ được phép nhập mới, thành viên hoặc vip.
  • Ngày sinh phải có độ dài là 10

Khi người dùng nhập “dae”: Hiển thị tất cả danh sách nhân viên hiện có trong công ty.

Khi người dùng nhập “dac”: Hiển thị tất cả danh sách khách hàng hiện có của công ty.

Khi người dùng nhập “cs”: Thống kê khách hàng dựa theo loại khách hàng. Chương trình sẽ hiển thị số lượng khách hàng mới, thành viên, vip.

Khi người dùng nhập “ea”: Chương trình sẽ hiển thị thông báo xác nhận “Bạn có muốn thoát chương trình không (c/k)?”. Nếu nhập “c”, sẽ thoát chương trình.