مفهوم Abstract و Interface در جاوا
در سری مقالات آموزش شی گرایی در جاوا , به مفاهیم Abstract و Interface میپردازیم.
در مقاله قبل به مفهوم ارث بری پرداختیم. کلاس Abstract کلاس هایی هستند که تنها راه استفاده از آنها ارث بری از آنها است. این کلاس ها قابلیت object سازی از روی آنها را ندارند. در تعریف کلاس های Abstract واژه کلیدی abstract قبل از واژه کلیدی class میآید.
public abstract class ZeroToHeroAbstract
در این کلاس های علاوه بر تعریف متد ها به روش عادی میتوان متد ها را به صورت abstract نیز تعریف کرد
public abstract void methodA();
همانطور که در مثال فوق مشخص است, متد بالا فاقد بدنه است و کلاس ارث برنده باید این متد را پیاده سازی کند. یکی از خواص مهم abstract نیز همین است. متد های abstract پیاده سازی شده در کلاس ارث برنده با Override Annotation نمایش داده میشوند.
public abstract class ZeroToHeroAbstract { public abstract void methodA(); } class ZtH extends ZeroToHeroAbstract{ @Override public void methodA() { } }
همچنین کلاس های abstract که خود از یک کلاس abstract دیگر ارث میبرند, میتوانند متد هایی که باید پیاده سازی شود را پیاده نکنند و پیاده سازی آنها را به کلاس ارث برنده غیر abstract واگذار کنند.
public abstract class ZeroToHeroAbstract { public abstract void methodA(); } abstract class SecondAbastract extends ZeroToHeroAbstract{ public void methodB(){ // this is method B } } class ZtH extends SecondAbastract{ @Override public void methodA() { // this is method A from Zero to hero Abstract Class } }
برای درک بهتر کلاس های abstract به بررسی یک مثال میپردازیم. فرض کنید میخواهیم مدل های مختلفی از خودرو هارا پیاده کنیم. هر خودرو یکسری رفتار مشخص دارد اما کیفیت این رفتار متفاوت است. برای مثل هر خودرو یک معیار برای تعیین قدرت دارد. اما قدرت در تمام خودرو ها وجود دارد. برای پیاده سازی آن به این روش عمل میکنیم :
public abstract class Cars { public abstract float power(); public abstract float fuel(); public abstract float speed(); } abstract class BMW extends Cars { @Override public float fuel() { return 12; } } class I8 extends BMW { @Override public float power() { return 0; } @Override public float speed() { return 0; } } abstract class Audi extends Cars{ @Override public float power() { return 10; } } class A3 extends Audi { @Override public float fuel() { return 0; } @Override public float speed() { return 0; } }
در مثال فوق ابتدا مواردی درباره خودرو در کلاس Car مشخص شده اند. تمام خودرو هایی که میخواهیم پیاده سازی کنیم شامل چنین مواردی هستند. سپس هر شرکت یک معیار ثابت برای خودرو های خود دارد. برای مثال مصرف سوخت در خودرو های BMW ثابت است و در خودرو های Audi قدرت خودرو ها ثابت است. به این ترتیب در کلاسی که مختص به شرکت آنها است خصوصیت مشترک را پیاده سازی میکنیم. در نهایت در پیاده سازی هر خودرو باید باقی خصوصیاتی که مشخص نشده است را مشخص کنیم. مثال فوق نشان میدهد که با استفاده از شی گرایی و مفاهیم آن میتوان ساختار منظمی برای پروژه ها ایجاد کرد.
کلاس های abstract این قابلیت را داشتند تا متد ها درون آنها پیاده سازی شوند و یا به صورت abstract باشند و توسط کلاس ارث برنده پیاده سازی شوند. کلاسی که تمام متد های آن abstract باشد یک interface است. همچنین میتوان متد های static و default را در interface ها پیاده سازی کرد. متد های default متد هایی هستند که در جاوا ۸ معرفی شده اند و به این ترتیب interface ها نیز میتوانند برای متد های خود بدنه مشخص کنند.
خاصیت دیگری که interface ها دارند این است که میتوانند به تعداد نامحدود در کلاس ها استفاده شوند. در جاوا محدودیت ارث بری وجود دارد و یک کلاس تنها میتواند از یک کلاس ارث ببرد اما یک کلاس میتواند از تعداد نامحدودی interface استفاده کند. برای استفاده از interface ها از کلمه کلیدی implement استفاده میشود و برای استفاده از چند interface باید مابین آنها ” , “ قرار گیرد.
class ZeroToHero extends ClassT implements InterfaceZ , InterfaceH
مثال فوق را میتوان به این صورت تغییر داد :
public interface Cars { public float power(); public float fuel(); public float speed(); } abstract class BMW implements Cars { @Override public float fuel() { return 12; } } class I8 extends BMW { @Override public float power() { return 0; } @Override public float speed() { return 0; } } abstract class Audi implements Cars{ @Override public float power() { return 10; } } class A3 extends Audi { @Override public float fuel() { return 0; } @Override public float speed() { return 0; } }
در interface ها و در کلاس های abstract میتوان متغیر ها را نیز تعریف کرد.
در این آموزش به مفاهیم interface و کلاس های abstract پرداختیم. دانستن این مفاهیم برای استفاده از library های جانبی بسیاز حائز اهمیت میباشد. این مفاهیم میتواند به شما کمک کند تا مدل های پروژه را بسیار بهتر پیاده سازی کنید و خوانایی پروژه خود را افزایش دهید.
سری مقالات آموزش شی گرایی به پایان رسیده است.
با ادامه مباحث جاوا با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
از Java به Dart – کلاس و Constructor
آموزش Gradle – اهمیت Project Automation
تفاوت Sequence و List در کاتلین
بهترین محیط های توسعه(IDE) برای جاوا
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
4 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
مطلب بسیار خوبی بود.ممنون
سلام دوست عزیز. ممنون از همراهیتون
بسیار ممنون
مفاهیم کلی برای استفاده کاربردی تر از libraryها رو اگه میشه بیشتر بگید
با سلام و تشکر بابت همراهیتون. لطفا سوالتون واضح تر بفرمایید.