Abstract چیست؟ — توضیح کلاس آبسترکت در برنامه نویسی به زبان ساده
در برنامه نویسی شی گرا، کلاس Abstract (آبسترکت | انتزاعی) روشی برای تعریف «متُدها» (Method) و «متغیرها» (Variable) در کلاس است که شامل متدهای Abstract میشوند. این کلاس یکی از بخشهای مهم یادگیری برنامه نویسی در شی گرایی به حساب میآید و برای فعالیت در این زمینه بهتر است که به خوبی فرا گرفته شود. در این مقاله سعی شده است به طور جامع و به همراه مثالهایی با استفاده از زبانهای برنامه نویسی جاوا و C++ به این سوال پاسخ داده شود که کلاس Abstract چیست و این مفهوم مهم در شی گرایی از همه جهت مورد بررسی قرار بگیرد.
Abstract چیست ؟
انتزاع یا «Abstraction» در شی گرایی فرآیندی است که طی آن تنها اطلاعات مورد نیاز نمایش داده خواهند شد و اطلاعات غیرضروری پنهان میشوند. میتوان گفت که هدف اصلی انتزاع، «پنهان کردن» دادهها به حساب میآید. انتزاع به معنی انتخاب دادههای مناسب از میان گروه زیادی از دادهها، برای نشان دادن اطلاعات مورد نیاز جهت کمک به کاهش پیچیدگی و چالشهای برنامه است. کلاس و متدها هم میتوانند انتزاعی باشند. کلاس انتزاعی نوعی کلاس است که یک یا چند متد انتزاعی در آن تعریف میشود. متد انتزاعی در تعریف متدها نمود پیدا میکند و پیادهسازی متدها شامل آن نمیشود.
انتزاع یکی از چند خصوصیت مهم و اصلی شی گرایی به حساب میآید. به طور کلی شی گرایی در برنامه نویسی حوزهای است که علاوه بر دو مفهوم اساسی «کلاس» (Class) و «شی» (Object)، چهار اصل و خصیصه کلیدی را نیز شامل میشود. این چهار خصوصیت و اصل مهم در شیگرایی در ادامه فهرست شدهاند:
- وراثت یا ارث بری (Inheritance)
- تجرید یا انتزاع (Abstraction)
- پلی مورفیسم یا چند ریختی یا چند شکلی (Polymorphism)
- کپسوله سازی (Encapsulation)
زمانی که یک شی با روش انتزاع داده مدلسازی میشود، مجموعههای یکسانی از دادهها در کاربردهای مختلف قابل استفاده هستند. از جمله این کاربردها میتوان به کلاسهای انتزاعی، رفتارهایی از نوع عام (Generic) و سلسله مراتب برنامه نویسی شی گرا اشاره کرد. متُدهای انتزاعی زمانی استفاده میشوند که بیش از یک «زیرکلاس» (Subclass) وظیفه یکسانی را به روشهای مختلف و از طریق پیادهسازیهای متفاوت انجام میدهند. یک کلاس انتزاعی میتواند هر دو نوع متد یعنی متدهای انتزاعی و متدهای معمولی را شامل شود. در ادامه این مقاله به بررسی دقیقتر کلاس آبسترکت پرداخته شده است.
کلاس Abstract چیست ؟
کلاس انتزاعی (آبسترکت | Abstract) نوعی تعریف از متدها و متغیرهای یک کلاس یا گروهی از «اشیا» (Object) به حساب میآید که در آن یک یا چند «متد انتزاعی» (Abstract Method) تعریف و استفاده شده است. کلاسهای انتزاعی در همه زبانهای برنامه نویسی شی گرا، از جمله ++C، «جاوا» (Java)، #C و VB.NET استفاده میشوند. هم اشیا و هم کلاسها را میتوان انتزاعی کرد؛ به عبارت دیگر، آنها در ویژگیهایی خلاصه خواهند شد که با عملکرد برنامه فعلی مرتبط هستند.
نمونههای منحصربهفردی که از کلاسها حاصل میشوند، همان اشیاء هستند. «اعلان کردن» (Declare) کلاس به صورت انتزاعی به این معنی است که نمیتوان برای آن به طور مستقیم نمونه ایجاد کرد، به عبارت دیگر، شی نمیتواند از مستقیماً از کلاس انتزاعی ایجاد شود. این شیوه یعنی استفاده از کلاسهای آبسترکت باعث میشود بتوان از کدها در برابر استفاده نادرست محافظت کرد. کلاس Abstract به زیرکلاسهایی برای تعریف ویژگیهای مورد نیاز جهت نمونهسازی منحصربهفرد نیاز دارد. کلاسهای انتزاعی در تضاد با «کلاسهای عینی» (Concrete Class) هستند، این کلاسها «نوعی کلاس پیشفرض» (Default Type) در نظر گرفته میشوند.
کلاس عینی، هیچ متد انتزاعی ندارد و میتوان به راحتی نمونهسازی را بر اساس آن انجام داد. استفاده از کلاس Abstract در برنامه نویسی اجباری نیست، اما این مفهوم برای تمیزتر نوشته شدن کدها نسبت به روشهای دیگر و کارآمدتر کردن برنامه نویسی ارائه شده است؛ زیرا در این نوع کلاس دائماً به جزئیات اضافی اشاره نمیشود. کدهای زبان جاوا به دلیل اینکه «غیروابسته به پلتفرم» (Platform-Agnostic) هستند، در فایلهای کلاسی کامپایل میشوند که میتواند توسط هر ماشین مجازی جاوایی تفسیر شود.
پس از دانلود و نصب یک ماشین مجازی جاوا «سازگار» (Compatible) برای پلتفرم سیستم عامل، فایل کلاس به دست آمده میتواند بر روی ماشینهای مختلف اجرا شود. در زبانهای برنامه نویسی، یک کلاس انتزاعی، کلاسی عمومی یا نوعی شی است که به عنوان پایهای برای ایجاد اشیا خاص استفاده میشود. این کلاس با پروتکل آن یا مجموعه عملیاتی که پشتیبانی میکند مطابقت دارد. برای مثال، یک کلاس Abstract در زبان جاوا، «ابَرکلاس» (Super Class)، همان «کلاس پایه» (Base Class) یا «کلاس والدی» (Parental Class) است که قابلیت نمونهسازی ندارد و برای بیان و تعریف ویژگیهای کلی استفاده میشود.
در جاوا نمیتوان شیئی را با استفاده از کلاس انتزاعی جاوا تشکیل داد و تلاش برای نمونهسازی کلاس انتزاعی، تنها منجر به بروز خطای کامپایلر خواهد شد. در زبان جاوا و برخی زبانهای برنامه نویسی دیگر، کلاس Abstract با استفاده از کلمه کلیدیabstract اعلان میشود. زیرکلاسهای توسعهیافته از یک کلاس انتزاعی، علاوه بر ویژگیهای خاص مربوط به خود، همه ویژگیهای کلاس انتزاعی را هم دارند. کلاس Abstract ویژگیهای کلاس و متدهای پیادهسازی را مشخص میکند، بنابراین میتوان گفت کلاس آبسترکت یک «واسط» (Interface) کامل را تعریف خواهد کرد. در بخش بعدی از مبحث «کلاس Abstract چیست» به بررسی این کلاس در برنامه نویسی شی گرا پرداخته شده است.
کلاس Abstract در برنامه نویسی شی گرا چیست؟
در برنامه نویسی شی گرا، کلاسها نقشهساخت اشیا برای مسائلی هستند که قصد حل آنها در توسعه نرم افزار وجود دارد. کلاسها شامل مجموعهای از ویژگیها (Attribute | Property) و رفتارها (متُدها | Methods) هستند که میتوانند مبتنیبر کلاسهای تعریفشده قبلی باشند. برنامه نویسان از روش «وراثت» یا همان «ارثبری» (Inheritance) برای ایجاد پیادهسازیهای خاص کلاسهای انتزاعی استفاده میکنند. کلاسهایی که به وسیله کلاسهای Abstract ایجاد شدهاند، «کلاس مشتق شده» (Derived Class) یا همان زیرکلاس یا کلاس فرزند نامیده میشوند.
در این حوزه، کلاسهای Abstract در ریشه این سلسله مراتب قرار میگیرند و برای اعمال متدهایی استفاده میشوند که باید در کلاسهای مشتق شده «رونویسی» (Overridden) شوند، بنابراین با این روش از خطاهای ممکن در «زمان اجرا» (Runtime) جلوگیری میشود. کلاسهای Abstract به عنوان الگو برای زیرکلاسهای خود عمل میکنند. برای مثال، زیرکلاسBanyan_Tree که زیرکلاس کلاس انتزاعیTree است، همه ویژگیهای Tree و همچنین ویژگیهایی را دارد که مختصBanyan_Tree هستند. درک تفاوت بین کلاس Abstract و واسط برای برنامه نویسان ضروری است.
بخش بعدی از مبحث «کلاس Abstract چیست» پس از معرفی مجموعه دورههای آموزش برنامه نویسی فرادرس به بررسی دلیل استفاده از کلاس Abstract در برنامه نویسی اختصاص داده شده است.
معرفی فیلم های آموزش برنامه نویسی فرادرس
دورههای وب سایت آموزشی فرادرس بر اساس موضوع به صورت مجموعههای آموزشی مختلفی دستهبندی میشوند. یکی از این مجموعههای جامع، مربوط به آموزشهای انواع زبانهای برنامه نویسی گوناگون است. علاقهمندان و دانشجویان میتوانند برای یادگیری بیشتر مفاهیم مختلف برنامه نویسی و همچنین کلاسها و متدهای Abstract در زبانهای برنامه نویسی، از دورههای ارائه شده در این مجموعه آموزشی استفاده کنند. در زمان تدوین این مقاله، مجموعه دورههای برنامه نویسی فرادرس حاوی بیش از ۵۲۰ ساعت محتوای ویدیویی و حدود ۶۷ عنوان آموزشی متفاوت است. در ادامه، برخی از دورههای این مجموعه به طور خلاصه معرفی شدهاند:
- فیلم آموزش برنامه نویسی پایتون Python – مقدماتی (طول مدت: ۱۹ ساعت و ۵۳ دقیقه، مدرس: پژمان اقبالی شمس آبادی): در این دوره آموزشی فرادرس، زبان برنامه نویسی پایتون از پایهترین مفاهیم تا اصول پیشرفته آن آموزش داده میشود و سعی شده است که همه مباحث مقدماتی مورد نیاز آن ارائه شود. برای مشاهده فیلم آموزش برنامه نویسی پایتون Python – مقدماتی + کلیک کنید.
- فیلم آموزش برنامه نویسی C++ سی پلاس پلاس (طول مدت: ۲۰ ساعت و ۱۴ دقیقه، مدرس: دکتر فرشید شیرافکن): در این فرادرس، زبان برنامه نویسیC++ در دو بخش آموزش داده شده است. برای مشاهده فیلم آموزش برنامه نویسی C++ سی پلاس پلاس + کلیک کنید.
- فیلم آموزش برنامه نویسی جاوا Java (طول مدت: 19 ساعت و 19 دقیقه، مدرس: دکتر سید مصطفی کلامی هریس): این دوره آموزشی فرادرس به دانشجویان و علاقهمندانی پیشنهاد میشود که قصد یادگیری زبان برنامه نویسی جاوا را به صورت جامع دارند. برای مشاهده فیلم آموزش برنامه نویسی جاوا Java + کلیک کنید.
- فیلم آموزش برنامه نویسی C (طول مدت: ۱۳ ساعت و ۳۰ دقیقه، مدرس: دکتر سید مصطفی کلامی هریس): در این فرادرس، زبان برنامه نویسی C همراه با مفاهیم کاربردی آن به همراه مثالهای عملی آموزش داده شده است. برای مشاهده فیلم آموزش برنامه نویسی C + کلیک کنید.
- فیلم آموزش کاربردی برنامه نویسی سی شارپ #C (طول مدت: ۱۳ ساعت و ۵۸ دقیقه، مدرس: مهندس رشید شجاعی): در این دوره آموزشی فرادرس، آموزندگان به صورت کاربردی و عملی با زبان سی شارپ و محیطهای Visual Studio و داتنت آشنا میشوند. برای مشاهده فیلم آموزش کاربردی برنامه نویسی سی شارپ #C + کلیک کنید.
- فیلم آموزش برنامه نویسی تایپ اسکریپت TypeScript (طول مدت: ۸ ساعت و ۴۵ دقیقه، مدرس: پوریا کهریزی): این فرادرس به علاقهمندانی پیشنهاد شده است که قصد یادگیری زبان برنامه نویسی تایپ اسکریپت را از پایهترین مفاهیم آن دارند. تایپ اسکریپت دارای شباهتهای بسیاری با زبانهای سی شارپ و جاوا اسکریپت است. برای مشاهده فیلم آموزش برنامه نویسی تایپ اسکریپت TypeScript + کلیک کنید.
در ادامه مبحث «کلاس Abstract چیست» و پس از معرفی مختصر برخی از دورههای آموزش برنامه نویسی فرادرس، به بررسی دلیل استفاده از کلاس Abstract در برنامه نویسی پرداخته میشود.
چرا از کلاس Abstract در برنامه نویسی استفاده میشود؟
مفهوم کلاسهای آبسترکت بسیار نزدیک به مفهوم ارث بری در برنامه نویسی شی گرا است. وراثت روشی است که با استفاده از آن یک شی خصوصیتهای شی دیگری را کسب میکند یا به ارث میبرد. وراثت از طبقهبندی سلسله مراتبی (Hierarchical Classification) نیز پشتیبانی میکند. ایده دستهبندی سلسله مراتبی (طبقهبندی بالا به پایین) به این صورت است که کلاسهای جدیدی مبتنی بر کلاسهای فعلی ایجاد میشوند. وقتی یک کلاس جدید از کلاس فعلی ارثبری میکند، به این معنی است که میتوان از متُدها و فیلدهای کلاس والد دوباره استفاده کرد.
وراثت بازنمودی از رابطه والد و فرزند به حساب میآید. مثلاً نهنگ عضوی از دستهبندی حیوانات دریایی به حساب میآید. این حیوانات دریایی نیز بخشی از کلاس پستانداران هستند. پستانداران هم زیرکلاس حیوانات محسوب میشوند. از دستهبندی سلسله مراتبی در صورتی استفاده میشود که مثلاً قصد توصیف دسته خاصی از حیوانات مثل پستانداران وجود داشته باشد. در این دستهبندی سلسله مراتبی، دسته یا همان کلاس پستانداران دارای خصوصیتهای (Attribute) جزئیتری مثل دندانها، خونسردی، خونگرمی و سایر موارد نیز هستند.
در واقع پستانداران زیرکلاسی برای کلاس حیوانات به حساب میآیند و دسته حیوانات نیز ابرکلاس دسته پستانداران محسوب میشوند. زیرکلاس، کلاسی است که خصوصیتهای سوپر کلاس را به ارث میبرد. یک سوپر کلاس، کلاسی پایه است که زیرکلاس یا کلاس مشتق شده خصوصیتهای آن را به ارث میبرند. برای بررسی دلیل استفاده از کلاس Abstract در برنامه نویسی بهتر است مثالی برای درک آن شرح داده شود.
مثالی برای واضح تر شدن دلیل استفاده از کلاس آبسترکت در شی گرایی
در این مثال، فرض میشود باید حقوق کارمندان محاسبه شوند و کارمندان به دو دسته پاره وقت و تمام وقت تقسیم میشوند. همانطور که مشخص است، شرکت حقوق این دو دسته را با روشهای مختلفی محاسبه میکند. با این حال، آنها هنوز هم برخی ویژگیها و عملکردهای مشترکی از جمله نام، نام خانوادگی، شماره پرسنلی، حقوق و سایر موارد دارند. حقوق موردی است که باید برای هر کارمند به صورت جداگانه محاسبه شود. بنابراین، باید روشی برای محاسبه حقوق در کلاس پایه کارمندان وجود داشته باشد و هر دو کارمند این روش را به ارث میبرند.
باید به این موضوع توجه داشت که اگرچه یک کارمند در هر صورت دارای حقوقی است، اما برای محاسبه آن باید نوع کارمند اعم از پاره وقت یا تمام وقت مشخص شود. در این مسئله متد محاسبه حقوق باید به صورت Abstract در کلاس کارمند باشد و با توجه به نوع کارمند پیادهسازی متناسبی در زیرکلاسها داشته باشد. در بخش بعدی از مقاله «کلاس Abstract چیست» به بررسی متد Abstract پرداخته شده است.
متد Abstract چیست ؟
متدهای Abstract، متدهایی هستند که بدون پیادهسازی، اعلان میشوند. کلاسهای Abstract شامل متدهای Abstract میشوند. مثلاً یک متد Abstract را میتوان در زبان جاوا به صورت زیر پیادهسازی کرد:
1abstract void moveTo(double deltaX, double deltaY);
اگر یک کلاس دارای متد Abstract باشد، این کلاس باید با کلمه کلیدیabstract اعلان شود؛ شبهکدی از نحوه اعلان این نوع کلاسها در ادامه ارائه شده است:
1public abstract class GraphicObject {
2 // declare fields
3 // declare nonabstract methods
4 abstract void draw();
5}
هنگامی که یک کلاس Abstract به عنوان زیرکلاس در نظر گرفته میشود، معمولاً این زیرکلاس پیادهسازیهایی را برای همه متدهای انتزاعی در کلاس والد خود ارائه میدهد. با این حال، اگر به این صورت نباشد، زیرکلاس نیز باید به صورت انتزاعی اعلان شود.
نکته مهمی در رابطه با متدها وجود دارد و آن هم این است که متدهایی که در یک واسط یا اینترفیس به صورت پیشفرض یا «ثابت» (Static) اعلان نشدهاند، به طور صریح انتزاعی در نظر گرفته میشوند. بنابراین، اصلاح کنندههای انتزاعی با متدهای واسط استفاده نمیشوند. البته میتوان از آن استفاده کرد ولی غیر ضروری است. در ادامه مثالی از دنیای واقعی برای درک بهتر اینکه Abstract چیست ارائه شده است.
مثال Abstract در برنامه نویسی
در مثال ارائه شده زیر، هدف ایجاد یک درخواستنامه دانشآموزی برای دریافت اطلاعات دانشآموزان است. برخی از اطلاعاتی که جمعآوری میشوند در ادامه فهرست شدهاند:
- نام
- نام خانوادگی
- کلاس
- نشانی
- تاریخ تولد
- نام پدر
- نام مادر
- شماره دانشآموزی
ممکن است همه اطلاعات جمعآوری شده برای پُر کردن این درخواستنامه مورد نیاز نباشند. بنابراین، تنها اطلاعاتی انتخاب میشوند که برای تکمیل درخواستنامه مورد نیاز هستند. از این رو، اطلاعات دانشآموزان از دادههای بزرگ دریافت، حذف و گزینش شدهاند. این فرآیند در مفاهیم شی گرایی به عنوان انتزاع شناخته میشود. در ادامه مثالی از یک کلاس Abstract در زبان برنامه نویسی «جاوا» (Java) ارائه شده است:
1//abstract parent class
2 Abstract class animal {
3 //abstract method
4 public abstract void sound ( ) ;
5 }
6 Public class lion extends animal {
7 Public void sound ( ) {
8System.out.println (“ roar “ );
9}
10public Static void main ( String args [ ] ) {
11 animal obj = new lion ( );
12obj. sound ();
13}
14}