Giao diện trong C ++ (Lớp trừu tượng)

Một giao diện mô tả hành vi hoặc khả năng của một lớp C ++ mà không cam kết thực hiện cụ thể của lớp đó.

Các giao diện C ++ được triển khai bằng cách sử dụng abstract classes và các lớp trừu tượng này không nên nhầm lẫn với trừu tượng hóa dữ liệu là một khái niệm giữ các chi tiết triển khai tách biệt với dữ liệu liên quan.

Một lớp được tạo thành trừu tượng bằng cách khai báo ít nhất một trong các hàm của nó như pure virtualchức năng. Một hàm ảo thuần túy được chỉ định bằng cách đặt "= 0" trong khai báo của nó như sau:

class Box {
   public:
      // pure virtual function
      virtual double getVolume() = 0;
      
   private:
      double length;      // Length of a box
      double breadth;     // Breadth of a box
      double height;      // Height of a box
};

Mục đích của một abstract class(thường được gọi là ABC) là cung cấp một lớp cơ sở thích hợp mà từ đó các lớp khác có thể kế thừa. Các lớp trừu tượng không thể được sử dụng để khởi tạo các đối tượng và chỉ phục vụ như mộtinterface. Cố gắng khởi tạo một đối tượng của một lớp trừu tượng gây ra lỗi biên dịch.

Do đó, nếu một lớp con của ABC cần được khởi tạo, nó phải thực hiện từng hàm ảo, có nghĩa là nó hỗ trợ giao diện được khai báo bởi ABC. Không thể ghi đè một hàm ảo thuần túy trong một lớp dẫn xuất, sau đó cố gắng khởi tạo các đối tượng của lớp đó, là một lỗi biên dịch.

Các lớp có thể được sử dụng để khởi tạo các đối tượng được gọi là concrete classes.

Ví dụ về lớp trừu tượng

Hãy xem xét ví dụ sau, trong đó lớp cha cung cấp một giao diện cho lớp cơ sở để triển khai một hàm được gọi là getArea() -

#include <iostream>
 
using namespace std;
 
// Base class
class Shape {
   public:
      // pure virtual function providing interface framework.
      virtual int getArea() = 0;
      void setWidth(int w) {
         width = w;
      }
   
      void setHeight(int h) {
         height = h;
      }
   
   protected:
      int width;
      int height;
};
 
// Derived classes
class Rectangle: public Shape {
   public:
      int getArea() { 
         return (width * height); 
      }
};

class Triangle: public Shape {
   public:
      int getArea() { 
         return (width * height)/2; 
      }
};
 
int main(void) {
   Rectangle Rect;
   Triangle  Tri;
 
   Rect.setWidth(5);
   Rect.setHeight(7);
   
   // Print the area of the object.
   cout << "Total Rectangle area: " << Rect.getArea() << endl;

   Tri.setWidth(5);
   Tri.setHeight(7);
   
   // Print the area of the object.
   cout << "Total Triangle area: " << Tri.getArea() << endl; 

   return 0;
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Total Rectangle area: 35
Total Triangle area: 17

Bạn có thể thấy cách một lớp trừu tượng xác định giao diện theo getArea () và hai lớp khác được thực hiện cùng một chức năng nhưng với thuật toán khác nhau để tính diện tích cụ thể cho hình dạng.

Chiến lược thiết kế

Một hệ thống hướng đối tượng có thể sử dụng một lớp cơ sở trừu tượng để cung cấp một giao diện chung và chuẩn hóa phù hợp cho tất cả các ứng dụng bên ngoài. Sau đó, thông qua kế thừa từ lớp cơ sở trừu tượng đó, các lớp dẫn xuất được hình thành hoạt động tương tự.

Các khả năng (tức là các chức năng chung) được cung cấp bởi các ứng dụng bên ngoài được cung cấp dưới dạng các chức năng ảo thuần túy trong lớp cơ sở trừu tượng. Việc triển khai các hàm ảo thuần túy này được cung cấp trong các lớp dẫn xuất tương ứng với các kiểu cụ thể của ứng dụng.

Kiến trúc này cũng cho phép các ứng dụng mới được thêm vào hệ thống một cách dễ dàng, ngay cả khi hệ thống đã được xác định.