Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การประกาศ Interface ใน C++


Interface (อินเตอร์เฟซ) อธิบายพฤติกรรมหรือความสามารถของคลาส C++ โดยไม่ผูกมัดกับการใช้งานเฉพาะของคลาสนั้น

Interface ใน C++ ถูกนำไปใช้โดยใช้ abstract classes (คลาสนามธรรม) และคลาสนามธรรมเหล่านี้ไม่ควรสับสนกับ data abstraction (การนามธรรมข้อมูล) ซึ่งเป็นแนวคิดในการแยกข้อมูลการใช้งานออกจากข้อมูลที่เกี่ยวข้อง

คลาสจะกลายเป็น abstract โดยการประกาศฟังก์ชันอย่างน้อยหนึ่งฟังก์ชันเป็น pure virtual function (ฟังก์ชันเสมือนบริสุทธิ์) Pure virtual function ถูกกำหนดโดยการวาง "= 0" ในการประกาศ ดังนี้ -

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
};

วัตถุประสงค์ของ abstract class (มักเรียกว่า ABC) คือเพื่อให้คลาสฐานที่เหมาะสมซึ่งคลาสอื่นๆ สามารถสืบทอดได้ Abstract classes ไม่สามารถสร้างออบเจกต์ได้ และทำหน้าที่เพียงเป็น interface เท่านั้น การพยายามสร้างออบเจกต์ของ abstract class จะทำให้เกิด compilation error

ดังนั้น หาก subclass ของ ABC ต้องการถูกสร้างเป็นออบเจกต์ มันต้อง implement ฟังก์ชันเสมือนบริสุทธิ์ทุกตัว หมายความว่ามันรองรับ interface ที่ประกาศโดย ABC หากล้มเหลวในการ override pure virtual function ในคลาสลูก แล้วพยายามสร้างออบเจกต์ของคลาสนั้น จะเกิด compilation error

คลาสที่สามารถนำไปสร้างออบเจกต์ได้เรียกว่า concrete classes

พิจารณาตัวอย่างต่อไปนี้ที่คลาสพาเรนต์ให้ interface แก่คลาสฐานเพื่อ implement ฟังก์ชันชื่อ getArea() -

ตัวอย่างโค้ด

#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;
}

ผลลัพธ์

Total Rectangle area: 35
Total Triangle area: 17

คุณเห็นได้ว่า abstract class กำหนด interface ในรูปของ getArea() และคลาสอื่นๆ อีกสองคลาส implement ฟังก์ชันเดียวกันแตกต่างกัน เพื่อคำนวณพื้นที่เฉพาะรูปทรง

Design Strategy (กลยุทธ์การออกแบบ)

ระบบ object-oriented อาจใช้ abstract base class เพื่อให้ interface ที่เหมาะสมและมาตรฐานสำหรับแอปพลิเคชันภายนอกทั้งหมด จากนั้นผ่านการสืบทอดจาก abstract base class นั้น จะสร้าง derived classes ที่ทำงานคล้ายกัน

ความสามารถ (เช่น public functions) ที่เสนอโดยแอปพลิเคชันภายนอก ถูกจัดเตรียมเป็น pure virtual functions ใน abstract base class การนำ pure virtual functionsเหล่านี้ไปใช้งานจริงจะอยู่ใน derived classes ที่ตรงกับประเภทเฉพาะของแอปพลิเคชัน

สถาปัตยกรรมนี้ยังช่วยให้สามารถเพิ่มแอปพลิเคชันใหม่เข้าไปในระบบได้ง่าย แม้หลังจากที่ระบบถูกกำหนดไว้แล้ว