Lập trình C#

Tính kế thừa trong lập trình C#

Tính kế thừa trong lập trình C#
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

Tính kế thừa trong lập trình C#

Trong bài viết này chúng ta sẽ cùng tìm hiểu về tính kế thừa trong lập trình C#, với những nội dung sau:

  1. Tính kế thừa là gì?
  2. Ý nghĩa của Tính kế thừa
  3. Cú pháp khai báo và đặc điểm của Tính kế thừa
    • #1. Cú pháp khai báo.
    • #2. Đặc điểm của tính kế thừa.
1. Tính kế thừa là gì?
1. Tính kế thừa là gì?

– Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng là Tính kế thừa (Inheritance). Tính kế thừa cho phép tạo ra một lớp mới kế thừa Thuộc tínhPhương thức của một lớp khác. Sau đó có thể xây dựng thêm các thuộc tính và phương thức riêng của lớp mới đó.

Thuộc tính là đặc tính riêng vốn có của một sự vật, qua đó con người nhận thức được sự vật, phân biệt được sự vật này với sự vật khác. Thường là tính từ hoặc danh từ như màu sắc, mắt, mũi, tên, tuổi,…

Phương thức là cách thức và phương pháp để thực hiện một hành động nào đó. Thường là động từ như chạy, nhảy, ngủ,…

Lớp cha(lớp đang tồn tại) cho phép một một lớp khác kế thừa được gọi là lớp cơ sởBase Class, và lớp con(lớp mới) được gọi là lớp thừa kế hay lớp dẫn xuấtDerived Class.

2. Ý nghĩa của Tính kế thừa
2. Ý nghĩa của Tính kế thừa
  • Tính nhất quán: những đối tượng có chung nguồn gốc thì sẽ có những đặc điểm chung giống nhau.
  • Tái sử dụng code: những phần code chung chỉ cần định nghĩa một lần tại lớp cha(Base Class), các lớp con(Derived Class) đều có thể sử dụng mà không cần viết lại.
  • Thuận tiện trong việc bảo trì và phát triển. Khi sửa lỗi hay nâng cấp chỉ cần định nghĩa lại ở lớp cha.
Tính kế thừa được minh họa như sau:

Không kế thừa

Không kế thừa


Kế thừa - Inheritance

Kế thừa – Inheritance

・ Ở hình trên các bạn có thể thấy 2 lớp Con trâuCon cún có chung các thuộc tính: Mắt, Chân và các phương thức: Chạy, Ngủ. Đó đều là những đặc điểm chung của một động vật.

・ Do đó chúng ta sẽ tạo một lớp Động vật định nghĩa một lần những đặc điểm chung này rồi cho 2 lớp Con trâuCon cún kế thừa. Khi sử dụng chỉ cần gọi ra từ lớp Động vật lấy dữ liệu xử lý mà không cần viết riêng ở mỗi lớp gây ra sự trùng lặp mã lệnh.

・ Sau khi kế thừa những đặc điểm chung từ lớp Động vật, thì ứng với mỗi lớp Con trâu hoặc Con cún sẽ xây dựng thêm các thuộc tính và phương thức riêng của nó.

3. Cú pháp khai báo và đặc điểm của Tính kế thừa
3. Cú pháp khai báo và đặc điểm của Tính kế thừa

■ Cú pháp khai báo kế thừa trong C#:

[<quyen_truy_cap>] class <Ten_lop_cha>
{
   ...
}

[<quyen_truy_cap>] class <Ten_lop_con> : <Ten_lop_cha>
{
   ...
}

Trong đó:
quyen_truy_cap : là public hay private, protected,… Có thể có hoặc không.
Ten_lop_cha : Tên lớp cơ sở – Base Class
Ten_lop_con : Tên lớp dẫn xuất – Derived Class
・ Dấu hai chấm : biểu diễn sự kế thừa giữa 2 lớp trong C#

■ Đặc điểm của Tính kế thừa:

– Chỉ cho phép đơn kế thừa, tức là một lớp chỉ được phép kế thừa từ một lớp khác. (Vậy làm thế nào một lớp có thể sử dụng được các thuộc tính và phương thức của nhiều lớp khác nhau? Vấn đề này sẽ được trình bày trong bài Interface trong lập trình C#).

– Lớp con chỉ kế thừa được, chỉ sử dụng được các thuộc tính và phương thức có phạm vi truy cập là public, internal hoặc protected của lớp cha.

– Một đối tượng thuộc lớp cha có thể tham chiếu đến một đối tượng thuộc lớp con, nhưng ngược lại thì không được.

[code language=”csharp” highlight=”4,6″] // Tạo đối tượng con cún
ConCun cun1 = new ConCun(); // OK

DongVat cun2 = new ConCun(); // OK

//ConCun cun3 = new DongVat(); // ERROR: Cannot implicitly convert type ‘DongVat’ to ‘ConCun’
[/code]

– Từ khóa base tương tự như từ khóa super trong java dùng để truy cập đến các thành phần bên trong lớp cha từ lớp con.

・ Không dùng từ khóa base cho các thành phần(thuộc tính và phương thức) static, vì những thành phần này sẽ được truy cập trực tiếp bằng tên lớp.

– Từ khóa new trong kế thừa không phải là toán tử dùng để khởi tạo đối tượng, mà nó là một modifier dùng để xác định phạm vi của phương thức.

・ Trong trường hợp vì một lý do nào đó, bạn muốn tạo một phương thức ở lớp con có tên giống với tên của một phương thức ở lớp cha, thì để tránh nhập nhằng giữa 2 phương thứ này, bạn cần gắn từ khóa new cho phương thức ở lớp con.

Ví dụ bên dưới sẽ minh họa cách sử dụng từ khóa base, new, và cách gọi phương thức tĩnh (là phương thức khai báo có sử dụng từ khóa static) bằng tên lớp.

[code language=”csharp” highlight=”16,33,45,48″] using System;

namespace MinhHoangBlog
{
class Program
{
static void Main(string[] args)
{
// Tạo đối tượng Con Cún
ConCun cun = new ConCun();

// Gọi phương thức Chạy
cun.Chay();

// Gọi phương thức tĩnh bằng tên lớp
DongVat.Ngu();

Console.ReadKey();
}
}

/// <summary>
/// Class cơ sở Động Vật
/// </summary>
class DongVat
{
public void Chay()
{
Console.WriteLine( "Dong vat chay." );
}

// Phương thức tĩnh
public static void Ngu()
{
Console.WriteLine( "Dong vat ngủ." );
}
}

/// <summary>
/// Class dẫn xuất Con Cún
/// </summary>
class ConCun : DongVat // Kế thừa
{
// Phương thức CÙNG TÊN với lớp cha
public new void Chay()
{
// Gọi hàm từ lớp cha
base.Chay();

Console.WriteLine( "Con cun chay." );
}
}
}
[/code]

・ Kết quả chương trình:

Dong vat chay.

Con cun chay.

Dong vat ngủ.

– Như vậy, chúng ta đã cùng tìm hiểu xong tính kế thừa trong C#. Nếu có gì chưa hiểu thì các bạn comment nhé!

– Còn một phần khá quan trọng về tính kế thừa liên quan đến cách sử dụng hàm dựng (constructor), mời bạn đọc bài: Hàm dựng (constructor) và tính kế thừa trong C#.

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

7 bình luận

Translate »