Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Làm thế nào để khai báo interface trong C++?


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

Interface trong C++ được triển khai bằng các lớp trừu tượng (abstract classes), không nên nhầm lẫn với trừu tượng hóa dữ liệu (data abstraction) - khái niệm tách chi tiết triển khai khỏi dữ liệu liên kết.

Một lớp trở thành trừu tượng bằng cách khai báo ít nhất một hàm là hàm ảo thuần túy (pure virtual function). Hàm ảo thuần túy được chỉ định bằng cách đặt "= 0" trong khai báo:

class Box {
    public:
        // pure virtual function
        virtual double getVolume() = 0;
    private:
        double length;
        double breadth;
        double height;
};

Mục đích của lớp trừu tượng (thường gọi là ABC) là cung cấp lớp cơ sở thích hợp để các lớp khác kế thừa. Lớp trừu tượng không thể khởi tạo đối tượng, chỉ đóng vai trò interface. Cố gắng khởi tạo đối tượng của lớp trừu tượng gây lỗi biên dịch.

Do đó, nếu lớp con của ABC cần khởi tạo, nó phải triển khai tất cả các hàm ảo, nghĩa là hỗ trợ interface do ABC khai báo. Nếu không ghi đè hàm ảo thuần túy trong lớp dẫn xuất, rồi cố khởi tạo đối tượng của lớp đó, sẽ bị lỗi biên dịch.

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

Xét ví dụ: lớp cha cung cấp interface cho lớp cơ sở triển khai hàm getArea():

Ví dụ mã

#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);
    cout << "Total Rectangle area: " << Rect.getArea() << endl;
    Tri.setWidth(5);
    Tri.setHeight(7);
    cout << "Total Triangle area: " << Tri.getArea() << endl;
    return 0;
}

Kết quả

Total Rectangle area: 35
Total Triangle area: 17

Bạn thấy lớp trừu tượng định nghĩa interface qua getArea() và hai lớp triển khai hàm đó với thuật toán khác nhau tính diện tích theo hình dạng.

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

Hệ thống hướng đối tượng có thể dùng lớp cơ sở trừu tượng để cung cấp interface chung, chuẩn hóa cho tất 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 (hàm public) cung cấp cho ứng dụng bên ngoài được đặt như các hàm ảo thuần túy trong lớp cơ sở trừu tượng. Triển khai của 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 thêm ứng dụng mới vào hệ thống dễ dàng, ngay sau khi hệ thống đã được định nghĩa.