Computer >> Máy Tính >  >> Lập trình >> C ++

Làm thế nào để bạn khai báo một giao diện trong C ++?

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

Các giao diện C ++ được triển khai bằng cách sử dụng các lớp trừu tượng 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, 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ư một hàm ảo thuần túy. 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 lớp trừu tượng (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ột giao diện. 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à lỗi biên dịch.

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

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ó tên getArea () -

Mã mẫu

#include <iostream>
using namespace std;
class Shape { // Base class
   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;
};

class Rectangle: public Shape { // Derived classes
   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;
}

Đầu ra

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 đã triển khai cùng một chức năng nhưng với một thuật toán khác để tính toán 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à được tiêu chuẩn hóa thích 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 loại ứng dụng cụ thể.

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ả sau khi hệ thống đã được xác định.