Giới thiệu
Lớp trừu tượng là một trong những khái niệm quan trọng trên nền tảng .NET. Thường, bạn muốn tạo ra các lớp mà chỉ làm lớp gốc (base class – lớp đầu tiên trong cây thừa kế hay còn gọi là lớp tổ tiên), và dĩ nhiên, bạn sẽ không muốn người khác tạo ra đối tượng cho các lớp này. Chúng ta có thể sử dụng khái niệm lớp trừu tượng để cài đặt chức năng này trong C# sử dụng từ khóa ‘abstract‘.
Một lớp trừu tượng có nghĩa là không khởi tạo được đối tượng của lớp này, nhưng cho phép thừa kế để tạo ra lớp con.
Khai báo lớp trừu tượng trong C#:
abstract class tên_lớp_trừu_tượng { }
Ví dụ:
abstract class Window { }
Phương thức trừu tượng (abstract method)
Trong thiết kế hướng đối tượng, khi các bạn thiết kế ra một base class, và các bạn mong muốn rằng người khác khi thừa kế lớp này thì phải ghi đè (override) lên các phương thức xác định trước. Trong trường hợp người khác thừa kế lớp của các bạn mà không ghi đè lên những phương thức này thì trình biên dịch sẽ báo lỗi. Khái niệm phương thức trừu tượng sẽ giúp các bạn trong tình huống này.
Một lớp trừu tượng có thể chứa cả phương thức trừu tượng (phương thức không có phần thân) và phương thức bình thường (phương thức có phần thân hay phương thức thàdow
public class ListBox : Window
{
// Khởi dựng có tham số
public ListBox(int top, int left, string theContents)
: base(top, left) // gọi khởi dựng của lớp cơ sở
{
mListBoxContents = theContents;
}
public override void DrawWindow()
{
Console.WriteLine(“ListBox write: {0}”, mListBoxContents);
}
// biến thành viên private
private string mListBoxContents;
public override string Content
{
set { mListBoxContents = value; }
get { return mListBoxContents; }
}
}
[/code]
Trong ví dụ trên, các bạn thấy thuộc tính (property) Content được khai báo trong lớp Window, nhưng không có biến chứa dữ liệu cho nó không được khai báo trong lớp này. Do đó nó được cài đặt kiểu abstract.
Thuộc tính Content được override trong lớp con ListBox, và biến chứa dữ liệu cho nó là mListBoxContents.
Một số quy tắc áp dụng cho lớp trừu tượng
– Một lớp trừu tượng không thể là một sealed class. Khai báo như ví dụ dưới đây là sai:
// Khai báo sai abstract sealed class Window { }
– Phương thức trừu tượng chỉ khai báo trong lớp trừu tượng.
– Một phương thức trừu tượng không sử dụng chỉ định từ truy xuất là private.
// Khai báo sai abstract class Window { private abstract void DrawWindow(); }
Chỉ định từ truy xuất của phương thức trừu tượng phải giống nhau trong phần khai báo ở lớp cha lẫn lớp con. Nếu bạn đã khai báo chỉ định từ truy xuất protected cho phương thức trừu tượng ở lớp cha thì trong lớp con bạn cũng phải sử dụng chỉ định từ truy xuất protected. Nếu chỉ định từ truy xuất không giống nhau thì trình biên dịch sẽ báo lỗi.
– Một phương thức trừu tượng không sử dụng chỉ định từ truy xuất virtual. Bởi vì bản thân phương thức trừu tượng đã bao hàm khái niệm virtual.
// Khai báo sai abstract class Window { private abstract virtual void DrawWindow(); }
– Một phương thức trừu tượng không thể là phương thức static.
// Khai báo sai abstract class Window { private abstract static void DrawWindow(); }
Lớp trừu tượng (abstract class) và giao diện (interface)
Trong lớp trừu tượng chứa cả phương thức trừu tượng lẫn phương thức thành viên. Nhưng trong interface thì chỉ chứa phương thức trừu tượng và lớp con khi thừa kế từ interface cần phải ghi đè (override) lên các phương thức này.
interface IFile { void Save(); void Load(); }
Các phương thức trừu tượng khai báo trong interface không sử dụng chỉ định từ truy xuất, mặc định sẽ là public.
Một lớp chỉ có thể thừa kế từ một lớp cha, nhưng có thể thừa kế từ nhiều interface.