خب سعی می کنم که این مطلب رو به غیر رسمی ترین و خودمونی ترین بیان ممکن بنویسم تا خوندنش کمتر آزار دهنده باشه. خیلی ها در زمان خوندن C++ می پرسن تفاوت Abstract Class با Interface چی هستش. خب فهمیدن تفاوتشون مستلزم دونستن چند تا چیز قبلش هست.
Virtual Method چی هست؟
Virtual Method به متدی گفته می شه که می تونیم در کلاس مشتق شده، اون رو باز تعریف یا Override کنیم. نحوه ی تعریفش هم با Keyword ی به نام Virtual هستش. Virtual Method حتماً باید تعریف هم بشه.
virtual void method_second() }
cout << "Hi!";
{
Pure Virtual Method هم به متدی گفته می شه که نیاز به داشتن Body نداره و فقط باید تعریف بشه. راه تعریفش هم با همون Keyword به نام Virtual هست با این تفاوت که در آخرش = 0 هم قرار می دیم.
virtual void method_first() = 0 ;
حالا این که اصلاً اینترفیس و Abstract Class چی هستن؟
اینترفیس ها ملزم کننده ی کلاس ها هستند. یعنی اینکه هر کلاسی که اون ها رو پیاده سازی می کنه ملزم هست که فانکشن هاشون رو هم تعریف کنه. به بیان دیگه اینترفیس کلاس رو ملزم می کنه تا فانکشن های مشخصی رو تعریف و پیاده سازی کنه امّا خود اینترفیس نمی گه چجوری هر فانکشن باید پیاده سازی بشه فقط می گه همچین متد یا فانکشنی رو باید داشته باشیش. در اینترفیس ها همه ی متد ها Pure Virtual هستند.
/*an interface declaration*/
class InterfaceClass{
public:
virtual void method_first() = 0 ; // declaring a pure virtual method
virtual void method_second() = 0;
};
متد ها در Abstract Class هم مشابه اینترفیس هست امّا می تونن از هر دو نوع Virtual و Pure Virtual باشند ولی شرطش اینه که حداقل یک Pure Virtual Method وجود داشته باشه.
/*Declaring an abstract class*/
class AbstractClass{
public:
AbstractClass(std::string msg): message(msg){
virtual void method_first() = 0; // a pure virtual method
virtual void method_second(){ // implemented virtual method
std::cout << message;
}
}
private:
std::string message;
}
حالا که یکسری چیز ها برامون مشخص شد می تونیم بریم سراغ تفاوتشون. خب قبلتر گفتیم که وقتی کلاسی اینترفیسی رو پیاده سازی می کنه باید همه ی متد هاشم داشته باشه.
وقتی کلاسی Abstract Class رو ازش مشتق میشه هم باید متد هایی که Pure Virtual هستند رو حتماً داشته باشه و متد هایی هم که Virtual هستند رو می تونه هم داشته باشه و هم نداشته باشه. Abstract Class همونطور که از نامش مشخصه کلاس خلاصه است. یعنی کلاسی که حداقل تعداد متد ها رو داره. متد هایی که برای همه ی کلاس های مشتق شده مشترکه.
اگر بخوایم مثالی در نظر بگیریم مثلاً برنامه ی رسم اشکال هندسی رو در نظر بگیرید. همه ی اشکال ابعادی دارند. اما این ابعاد متفاوت هستند. مثلاً دایره شعاع یا قطر داره اما مربع و مستطیل طول و عرض و اشکال دیگه هم مشخصات دیگه. اگر مثلا برای کلاس Shape متد های SetWidth و SetHeight به صورت Pure virtual method تعریف کنیم برای مربع و مستطیل مشکلی پیش نمیاد اما واسه دایره به مشکل می خوریم. چون دایره طول و عرض نداره.
اما یک متدی همیشه مورد نیاز هست. چون برنامه ی ما برای “رسم” اشکال هست پس حتماً باید متد Draw داشته باشیم. بنابرین این متد Pure virtual تعریف می شود.
پس از Abstract Class جهت ایجاد اشیاء ای استفاده می کنیم که همه در یک یا چند مشخصه اشتراک دارند. امّا Interface برای مواقعی است که اشیائی که می خواهیم ایجاد کنیم ارتباط و اشتراکی با هم ندارند ولی نیاز هست مطمئن شویم هر کدام یکسری مشخصات رو دارند.
از اون گذشته از Virtual Method ها برای خاصیت چند ریختی یا Polymorphism در شیء گرایی استفاده می شود که البته به این نوشته مربوط نمیشود و در نوشته ی بعدی در مورد اون هم خواهم نوشت.