Tính trừu tượng trong C#

Tính trừu tượng (Abstraction) là một trong 4 tính chất trụ cột của lập trình hướng đối tượng OOP.

  • Tính đóng gói (Encapsulation).
  • Tính kế thừa (Inheritance).
  • Tính đa hình (Polymorphism).
  • Tính trừu tượng (Abstraction).

Nếu chưa hiểu rõ về lập trình hướng đối tượng thì bạn nên tham khảo bài viết dưới đây trước:

Lập trình hướng đối tượng (OOP) trong C# | Comdy
Lập trình hướng đối tượng (OOP) trong C# là gì? 5 khái niệm và 4 tính chất quan trọng của lập trình hướng đối tượng là gì?

Tính trừu tượng là khả năng ẩn chi tiết triển khai, chỉ cung cấp thông tin tính năng tới người dùng.

Tính trừu tượng được thể hiện qua abstract class và interface.

Triển khai tính trừu tượng bằng Abstract class

Sử dụng từ khóa abstract để khai báo abstract class trong C#. Abstract class có những đặc điểm sau:

  • Không thể tạo thể hiện cho abstract class.
  • Một abstract class có thể chứa các phương thức thông thường, phương thức ảo (virtual method) và phương thức trừu tượng (abstract method).
  • Không thể sử dụng từ khóa sealed cho abstract class vì nó ngăn không cho một lớp dẫn xuất kế thừa abstract class, trong khi đó abstract class cần phải được kế thừa vì không tạo thể hiện từ abstract class được.

Ví dụ về kế thừa abstract class trong C#:

using System;

namespace AbstractionApplication 
{
   abstract class ExportDataBase
   {
      public abstract void Export();
   }
   
   class TextExport : ExportDataBase 
   {
      public override void Export()
      {
         Console.WriteLine("Export data to .txt file");
      }
   }
   
   class CsvExport : ExportDataBase 
   {
      public override void Export()
      {
         Console.WriteLine("Export data to .csv file");
      }
   }
   
   class Application
   {
      private readonly ExportDataBase _exportData;
      
      public Application(ExportDataBase exportData)
      {
         _exportData = exportData;
      }
      
      public void ExportData()
      {
         _exportData.Export();
      }
   }
   
   class RectangleTester 
   {
      static void Main(string[] args) 
      {
         Application app = new Application(new TextExport());
         app.ExportData();
         Console.ReadKey();
      }
   }
}

Kết quả khi biên dịch và chạy chương trình trên:

Export data to .txt file

Triển khai tính trừu tượng bằng Interface

Interface được định nghĩa là một hợp đồng mà tất cả các lớp triển khai thực hiện (implement) interface phải tuân theo. Interface xác định phần 'cái gì' của hợp đồng và các lớp dẫn xuất xác định phần 'làm thế nào' của hợp đồng.

Interface khai báo các thuộc tính, phương thức và sự kiện là các thành viên của interface. Interface chỉ khai báo các thành viên, trách nhiệm của lớp dẫn xuất là triển khai thực hiện các thành viên này. Interface thường giúp cung cấp một cấu trúc tiêu chuẩn mà các lớp dẫn xuất sẽ tuân theo.

Các abstract class ở một mức độ nào đó phục vụ cho cùng một mục đích. Tuy nhiên, chúng chủ yếu được sử dụng khi chỉ có một vài phương thức được khai báo bởi lớp cơ sở và lớp dẫn xuất triển khai thực hiện các phương thức này.

Dưới đây là ví dụ về tính trừu tượng trong C# sử dụng interface:

using System;

namespace AbstractionApplication 
{
   interface IExportData
   {
      void Export();
   }
   
   class TextExport : IExportData 
   {
      public void Export()
      {
         Console.WriteLine("Export data to .txt file");
      }
   }
   
   class CsvExport : IExportData 
   {
      public void Export()
      {
         Console.WriteLine("Export data to .csv file");
      }
   }
   
   class Application
   {
      private readonly IExportData _exportData;
      
      public Application(IExportData exportData)
      {
         _exportData = exportData;
      }
      
      public void ExportData()
      {
         _exportData.Export();
      }
   }
   
   class RectangleTester 
   {
      static void Main(string[] args) 
      {
         Application app = new Application(new TextExport());
         app.ExportData();
         Console.ReadKey();
      }
   }
}

Kết quả khi biên dịch và chạy chương trình trên:

Export data to .txt file

Như các bạn thấy, lớp Application có chức năng ExportData, nó gọi phương thức Export của interface IExportData mà không cần quan tâm tới phương thức này làm gì.

Trên chương trình trên mình muốn xuất dữ liệu ra file txt nên khi khởi tạo thể hiện của class Application, mình chỉ cần truyền vào thể hiện của class TextExport là xong.

Nếu muốn xuất ra file csv thì mình chỉ cần thay thế bằng thể hiện của class CsvExport.



Bài viết liên quan:

Hướng dẫn này sẽ giúp bạn tìm hiểu về đọc ghi file (File I/O) trong C# và sử dụng các lớp tiện ích để đọc ghi file.

Reflection trong C#

  • 6 min read

Reflection trong C# là gì? Ứng dụng của Reflection trong C#. Cách khai báo và sử dụng Reflection trong C#.

Attribute trong C#

  • 7 min read

Attribute trong C# là gì? Có những loại attribute nào trong C#? Làm sao để sử dụng attribute trong C#.