یک اینترفیس (interface) رفتار یا قابلیتهای یک کلاس ++C را بدون درنظرگرفتن هیچ نوع پیادهسازی برای آن توصیف میکند.
اینترفیسهای ++C با استفاده از کلاسهای انتزاعی (abstract class) پیاده میشوند. این کلاسهای انتزاعی را نباید با مفهوم چکیدهسازی که برای جداسازی جزئیات پیادهسازی از دادهها به کار رفت اشتباه بگیریم.
یک کلاس را میتوان با اعلان حداقل یک تابع مجازی محض در آن، انتزاعی کرد. یک تابع مجازی با قرادادن «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 را اجرا کند. اگر یک کلاس مشتق شده در روند رونویسی (override) تابع مجازی محض با مشکل مواجه شود، آنگاه هرگونه نمونهگیری شی از آن به خطای کامپایل منجر میشود.
کلاسهایی که بتوان از آنها نمونهگیری انجام داد کلاسهای عینی (concrete class) نامیده میشوند.
مثالهایی از تابع انتزاعی
در مثال زیر کلاس والد، یک اینترفیس برای کلاس پایه فراهم کرده تا تابعی به نام ()getArea را پیاده کند.
#include <iostream> using namespace std; // Base class class Shape { 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; }; // Derived classes 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); // 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 تعریف کرده و دو کلاس دیگر همان تابع را با الگوریتمهای متفاوت پیاده سازی میکنند.
استراتژی طراحی
یک سیستم مبتنی بر شیگرایی، میتواند یک کلاس پایه انتزاعی را به عنوان یک اینترفیس استاندارد مشترک برای همه اپلیکیشنهای خارجی به کار بندد. سپس با ارثبری از این کلاس پایه انتزاعی، کلاسهای مشتق شدهای پدید میآید که مشابه هم عمل میکنند.
قابلیتهای (یعنی توابع عمومی) فراهم آمده از طریق این اپلیکیشنهای خارجی، همان توابع مجازی محض موجود در کلاس پایه انتزاعی میباشند. پیادهسازی این توابع محض در هرکلاس مشتق شده، بسته به نوع اپلیکیشن میتواند متفاوت باشد.
این نوع معماری همچنین امکان اضافه کردن اپلیکیشنهای جدید به سیستم، حتی پس از تعریف آن را به سهولت فراهم ساخته است.
منبع: ترجمه از سایت tutorialspoint.com
در جلسه بعدی آموزش ++C با ما همراه باشید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.