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

คุณจะประกาศอินเทอร์เฟซใน C ++ ได้อย่างไร


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

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

คลาสถูกทำให้เป็นนามธรรมโดยการประกาศฟังก์ชันอย่างน้อยหนึ่งฟังก์ชันเป็นฟังก์ชันเสมือนล้วนๆ ฟังก์ชันเสมือนบริสุทธิ์ถูกระบุโดยการวาง "=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
};

จุดประสงค์ของ คลาสนามธรรม (มักเรียกว่า ABC) คือการจัดหาคลาสพื้นฐานที่เหมาะสมซึ่งคลาสอื่นสามารถสืบทอดได้ ไม่สามารถใช้คลาสนามธรรมเพื่อสร้างอินสแตนซ์ออบเจ็กต์และทำหน้าที่เป็นอินเทอร์เฟซเท่านั้น ความพยายามที่จะยกตัวอย่างวัตถุของคลาสนามธรรมทำให้เกิดข้อผิดพลาดในการรวบรวม

ดังนั้น ถ้าคลาสย่อยของ ABC จำเป็นต้องสร้างอินสแตนซ์ จะต้องใช้งานฟังก์ชันเสมือนแต่ละฟังก์ชัน ซึ่งหมายความว่าสนับสนุนอินเทอร์เฟซที่ประกาศโดย ABC ความล้มเหลวในการแทนที่ฟังก์ชันเสมือนแท้ในคลาสที่ได้รับ จากนั้นพยายามสร้างอินสแตนซ์อ็อบเจ็กต์ของคลาสนั้นเป็นข้อผิดพลาดในการรวบรวม

คลาสที่ใช้สร้างอินสแตนซ์ของวัตถุได้เรียกว่า คลาสคอนกรีต .

พิจารณาตัวอย่างต่อไปนี้ซึ่งคลาสพาเรนต์จัดเตรียมอินเทอร์เฟซให้กับคลาสฐานเพื่อใช้ฟังก์ชันที่เรียกว่า 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

คุณสามารถดูว่าคลาสนามธรรมกำหนดอินเทอร์เฟซอย่างไรในแง่ของ getArea() และคลาสอื่นอีกสองคลาสใช้ฟังก์ชันเดียวกัน แต่มีอัลกอริธึมที่แตกต่างกันในการคำนวณพื้นที่เฉพาะของรูปร่าง

กลยุทธ์การออกแบบ

ระบบเชิงวัตถุอาจใช้คลาสพื้นฐานที่เป็นนามธรรมเพื่อจัดเตรียมอินเทอร์เฟซทั่วไปและเป็นมาตรฐานที่เหมาะสมสำหรับแอปพลิเคชันภายนอกทั้งหมด จากนั้นผ่านการสืบทอดจากคลาสฐานที่เป็นนามธรรมนั้น คลาสที่ได้รับจะถูกสร้างขึ้นที่ทำงานคล้ายกัน

ความสามารถ (เช่น ฟังก์ชันสาธารณะ) ที่นำเสนอโดยแอปพลิเคชันภายนอกมีให้เป็นฟังก์ชันเสมือนแท้ในคลาสฐานนามธรรม การใช้งานฟังก์ชันเสมือนล้วนๆ เหล่านี้มีให้ในคลาสที่ได้รับซึ่งสอดคล้องกับประเภทแอปพลิเคชันเฉพาะ

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