Antara muka C++ (kelas abstrak)
Antara muka menerangkan gelagat dan kefungsian kelas tanpa memerlukan pelaksanaan kelas tertentu.
Antara muka C++ dilaksanakan menggunakan kelas abstrak Abstrak kelas dan abstraksi data tidak dikelirukan antara satu sama lain.
Jika sekurang-kurangnya satu fungsi dalam kelas diisytiharkan sebagai fungsi maya tulen, kelas tersebut adalah abstrak. Fungsi maya tulen ditentukan dengan menggunakan "= 0" dalam pengisytiharan, seperti ditunjukkan di bawah:
class Box { public: // 纯虚函数 virtual double getVolume() = 0; private: double length; // 长度 double breadth; // 宽度 double height; // 高度 };
Tujuan mereka bentuk Kelas abstrak (sering dipanggil ABC) adalah untuk menyediakan Kelas lain menyediakan kelas asas yang sesuai untuk diwarisi. Kelas abstrak tidak boleh digunakan untuk membuat instantiate objek, ia hanya boleh digunakan sebagai antara muka. Jika anda cuba membuat instantiate objek kelas abstrak, ia akan menyebabkan ralat kompilasi.
Oleh itu, jika subkelas ABC perlu diwujudkan, setiap fungsi maya mesti dilaksanakan, yang juga bermakna C++ menyokong penggunaan ABC untuk mengisytiharkan antara muka. Jika fungsi maya tulen tidak dibebankan dalam kelas terbitan, percubaan untuk membuat instantiat objek kelas ini akan mengakibatkan ralat penyusunan.
Kelas yang boleh digunakan untuk membuat seketika objek dipanggil kelas konkrit.
Contoh kelas abstrak
Sila lihat contoh di bawah Kelas asas Shape menyediakan antara muka getArea(), yang dilaksanakan dalam dua kelas terbitan Rectangle dan Triangle. masing-masing. getArea():
#include <iostream> using namespace std; // 基类 class Shape { public: // 提供接口框架的纯虚函数 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 { 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; }
Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:
Total Rectangle area: 35 Total Triangle area: 17
Daripada contoh di atas, kita boleh lihat Lihat cara kelas abstrak mentakrifkan antara muka getArea(), dan cara dua kelas terbitan melaksanakan fungsi yang sama melalui algoritma berbeza untuk mengira kawasan.
Strategi Reka Bentuk
Sistem berorientasikan objek boleh menggunakan kelas asas abstrak untuk menyediakan antara muka yang sesuai, biasa, terpiawai kepada semua aplikasi luaran. Kemudian, kelas terbitan mewarisi semua operasi serupa dengan mewarisi kelas asas abstrak.
Fungsi yang disediakan oleh aplikasi luaran (iaitu fungsi awam) wujud dalam bentuk fungsi maya tulen dalam kelas asas abstrak. Fungsi maya tulen ini dilaksanakan dalam kelas terbitan yang sepadan.
Seni bina ini juga membolehkan aplikasi baharu ditambah dengan mudah pada sistem, walaupun selepas sistem ditakrifkan.