کلاسهای انتزاعی (Abstract Classes)
کلاس انتزاعی کلاسی است که نمیتوان از آن شی ساخت و فقط میتوان از آن ارثبری داشت. کاربرد این کلاسها وقتی است که بخواهیم یک کلاس برای مجموعهای از کلاسها بسازیم تا از آن ارثبری داشته باشند. فرض کنید قرار است ۱۰ کلاس طراحی کنیم که تمام آنها یک سری فیلدها و متدهای مشترک با هم دارند که به این ترتیب میتوانیم با ایجاد یک کلاس انتزاعی آن اعضای مشترک را در آن بنویسیم تا آن ۱۰ کلاس از این کلاس انتزاعی ارثبری داشته باشند.
برای تعریف یک کلاس به صورت انتزاعی باید هنگام تعریف کلاس از کلمه abstract استفاده کنیم.
مثال:
public abstract class Animal { private String color; private float weight; private boolean wild; public Animal(String color, float weight, boolean wild) { this.color = color; this.weight = weight; this.wild = wild; } public void walk() { System.out.println("Walking..."); } }
همانطور که میبینید این کلاس به صورت abstract تعریف شده است. اگر سعی کنید از این کلاس شی بسازید با خطای کامپایل روبرو خواهید شد.
حال میخواهیم کلاسی بسازیم تا از این کلاس ارثبری داشته باشد:
public class Cat extends Animal { private String breed; public Cat(String color, float weight, boolean wild, String breed) { super(color, weight, wild); this.breed = breed; } @Override public void walk() { System.out.println("Walking like a " + breed + " cat"); } }
همانطور که میبینید متد walk را Override کردهایم تا پیادهسازی دلخواه خود را برای آن بنویسیم. البته مجبور به این کار نبودیم و اگر این متد را Override نمیکردیم از همان متد walk که در کلاس Animal مینوشتیم استفاده میشد.
حال شیئی از کلاس Cat میسازیم و متد walk را از آن فراخوانی میکنیم:
Cat myCat = new Cat("Black", 5, false, "Persian"); myCat.walk();
متدهای انتزاعی (Abstract Methods)
در کلاسهای انتزاعی میتوان نوعی متد به نام متد انتزاعی تعریف کرد. اگر در یک کلاس انتزاعی متد یا متدهای انتزاعی وجود داشته باشند آنگاه کلاسی که از آن کلاس انتزاعی ارثبری دارد باید تمام آن متدهای انتزاعی را Override کند. این متدها بدنه ندارند و وظیفه کلاس فرزند است که آن را بنابر نیاز خود پیادهسازی کند.
مثال: میخواهیم متد walk که در مثال قبل در کلاس Animal نوشته بودیم را به یک متد انتزاعی تبدیل کنیم:
public abstract class Animal { private String color; private float weight; private boolean wild; public Animal(String color, float weight, boolean wild) { this.color = color; this.weight = weight; this.wild = wild; } public abstract void walk(); }
حال کلاسهایی که از این کلاس ارثبری داشته باشند الزاما باید این متد را Override کنند مگر آنکه کلاس فرزند خود یک کلاس انتزاعی باشد.
چند نکته راجع به متدهای انتزاعی
- متد abstract تنها می تواند در یک کلاس abstract تعریف شود.
- متد abstract بدنه ندارد.
- اگر در یک کلاس متد abstract وجود داشته باشد آنگاه کلاسهای فرزند آن کلاس الزاما باید آن متد را Override کنند مگر آنکه کلاس فرزند خود یک کلاس abstract باشد.
سلام ممنون بابت کار قشنگتون
فقط یه سوال این که نشه از یه کلاس Abstract شی ساخت چه مزیتی داره
خوب از یک کلاس معمولی ارث بری میکنیم چه فرقی میکنه
سلام. خوشحالم از اینکه مورد توجهتون واقع شده.
سوال خوبیه. در اکثر مواقع میشه طبق گفته شما از کلاس معمولی ارث بری داشت به جای اینکه کلاس Abstract تعریف کرد. همونطور که گفته شد از کلاس انتزاعی به هیچ وجه نمیشه شی ساخت اما از کلاس معمولی میشه.
شاید شما بگی من توی برنامه خودم کلاس معمولی میسازم و فقط ازش ارث بری می کنم و همیشه هم حواسم هست که ازش شی نسازم اما در فریم ورک های نرم افزاری و API هایی که به برنامه نویسان ارائه میشه باید برای اطمینان از اینکه برنامه نویسی که از کدها استفاده میکنه شیئی از کلاس نسازه و باعث مختل شدن روند کدها نشه باید از چارچوب های سفت و سخت برای اطمینان از درستی کار سیستم استفاده بشه.
اگر برنامه نویسی اندروید انجام داده باشید می بینید که در API اندروید به وفور از کلاس های انتزاعی استفاده شده.
نکته آخر اینکه کلاس های انتزاعی مثل اسمشون انتزاعی هستند و معمولا این کلاس ها وجود خارجی پیدا نمی کنند و فقط بیانگر یک مفهوم کلی هستند.
ایکاش یه جلسه هم به جلسه اخر اضافه می کردین که حالا باید برای ادامه کار چی کار کرد منابع چی میتونه باشه یا غیره … که بعد از این دوره بایدچه چیزهای دیگه یاد بگیریم همین
دوست عزیز ادامه راه بستگی به هدف شما داره. مثلا کسی که می خواد به توسعه اندروید بپردازه همین دوره جاوا براش کافیه و باید بره سراغ یادگیری فریمورک اندروید. یا مثلا کسی که قصد توسعه برنامه های سازمانی و وب رو داره باید بره سراغ Java EE.
موفق باشید
خب کلاس انتزاعی با اینترفیس چه فرقی داره ؟
دوتاشون رو نمیشه ازش شی ساخت ، تازه الان اینترفیس ها این قابلیت هم پیدا کردن که بتوانیم یک متد دارای بدنه توش بنویسیم با استفاده از کلمه کلیدی (default ) یعنی تقریبا این دوتا یکین فقط اسمش عوض شده !!!
خوب میشد آخر این آموزش فرق این دوتا رو مینوشتین ( البته اگر داشته باشن )
باز هم تشکر فراوان. ارایه مطلبتان ماندنی است.