مترجم : حبیب الله علیخانی
منبع:راسخون



 

Interface

در زبان برنامه نویسی جاوا چون وراثت چندگانه نداریم، برای رفع این محدودیت قابلیتی به نام Interface وجود دارد (مانند قابلیت Trait در زبانهایی مثل PHP و Scala )
interface در لغت یعنی رابط اما یک سینتکس (خلاصه) برای تعریف یک کلاس که تمام متد های آن abstract هستند می باشد.
کلاس های interfaceمانند کلاسهای abstract، در مواردی کاربرد دارند که یک یا چند امضای متد (methodsignature) در یک کلاس پدر حتما وجود داشته باشد ولی پیاده سازی (بدنه متد) نداشته باشد و تمام کلاس های فرزند مجبور باشند آن متدها را به روش خود پیاده سازی کنند (و یا اینکه خود abstract یا interface باشند(. اما کلاس های abstract می توانند متدهایی داشته باشند که پیاده سازی دارند.
یکی از کاربرد های دیگر کلاس های abstract و interface ها تعریف متد های callback است. برای این کار متد callback بصورت abstract در یک کلاس abstract تعریف می شود و یا بصورت یک متد در یک interface تعریف می شود.
متدهای یک interface همگی abstract هستند و پیاده سازی ندارند ولی یک کلاس abstract می تواند هیچ متد abstract ای نداشته باشد یا چند تا متد abstract داشته باشد و چند تا متد غیر abstract.
یک کلاس غیر abstract برای ارث بردن از یک interface باید آن را implements کند (یعنی از کلمه ی کلیدی implements برای به ارث بردن از یک interface استفاده می کند.) ولی برای ارث بردن از یک کلاس abstract باید آن را extends کند.
یک کلاس abstract علاوه بر اینکه می تواند یک یا چند interface را implements کند می تواند یک کلاس غیر abstrat و یا همچنین یک کلاس abstract را نیز extend کند ولی یک interface فقط می تواند یک interface دیگر را extends کند.
interface دو کاربرد دارد: 1- در وراثت 2- برای Eventها یا رویدادها (Event ها مبتنی بر interface ها هستند)

پیاده سازی یک پروژه در netbeans :

اکنون درnetbeans پروژه ای به نام interface به همراه کلاس main ایجاد می کنیم و در آن کلاسهای student و teacher وhuman می سازیم که کلاسهای student و teacher ، کلاس human را به ارث می برند دیاگرام زیر این ارث بری را نشان می دهد :
این پروژه همزمان از ویژگی وراثت (به صورت ارث بری کلاسهای student و teacher از human) و از ویژگی پلی مورفیسم برای پیاده سازی رفتار print و از ویژگی abstract (تا برای کلاسهای student و teacher متد add() و … را استاندارد سازی کند) استفاده می کند.( برای یادگیری بیشتراین پروژه ادامه ی پروژه ی مباحث وراثت و abstract و پلی موفیسم می باشد و پیش از این باید بر مباحث ذکر شده تسلط داشته باشید)
اکنون می خواهیم برای student رفتاری به نام انتخاب واحد و teacher رفتاری به نام ارائه ی درس استاندارد سازی کنیم. اگر این را به صورت abstract در human قرار دهیم، آنگاه student و هر کلاس دیگری که از human ارث بری می کند مانند کارمندان و.... باید ارائه درس کند و رفتار ارائه درس را در خود پیاده سازی کند. و همچنین teacher هر کلاس دیگری که از human ارث بری می کند مانند کارمندان و.... باید انتخاب واحد کند و رفتار انتخاب واحد را هم در خود پیاده سازی کند. اما این خوب نیست. می خواهیم هر رفتار مربوط به کلاس خودش شود. در نتیجه از interface کمک می گیریم. چون در جاوا امکان وراثت چندگانه وجود ندارد با کمک interface عمل مشابه وراثت چندگانه را انجام می دهیم.
پس یک interface به نام Forstudent برای کلاس student می نویسیم که رفتار های اختصاصی دانشجو مانند ثبت نام، حذف، انصراف و.. را در این می نویسیم و یک interface به نام Forteacher برای کلاس teacher می نویسیم که رفتار های اختصاصی استاد مانند ارائه درس، اعلام نمرات و.. را در این می نویسیم.
از یک شاخه وراثت (به human) را انجام می دهد و از شاخه ی دیگر پیاده سازی را انجام می دهد (interface فقط پیاده سازی است). دیاگرام زیر را در نظر بگیرید:
کد های هر کدام به صورت زیر است:
کلاس human دارای مشخصه های name , family , birthyear ,address و رفتارprint می باشد :
کلاس student از طریق کلمه ی کلیدی extends کلاس human را به ارث می برد و مثلا دارای مشخصه ی number (شماره دانشجویی) و رفتار print می باشد که پلی مورفیسم شده:
و همچنین کلاس teacher از طریق کلمه ی کلیدی extends کلاس human را به ارث می برد و مثلا دارای مشخصه ی grade (رتبه ی استاد) و رفتار print می باشد که پلی مورفیسم شده:
برای پیاده سازی interface دو راه داریم که یک روش را برای student و روش دیگر را برای teacher انجام می دهیم:
می خواهیم interface ، Forstudent را از روش اول ایجاد کنیم. مسیر زیر را طی می کنیم:
راست کلیک روی پروژه > new > java Interface…
در پنجره باز شده نام interface را وارد کرده و finish می کنیم:
کلاس interface مورد نظر با نام Forstudent به طور اتوماتیک در پکیج مشخص شده، ایجاد می شود که بدنه ی آن به صورت زیر است:
حال درون آن متد ثبت نام ( Regist) را تعریف می کنیم:
برای ایجاد interface ، Forteacher از روش دوم استفاده می کنیم :
مانند همیشه یک کلاس با نام Forteacher ایجاد می کنیم و کلمه کلیدی interface را بجای کلمه ی کلیدی Class جایگزین کنیم:
و درون آن متد ارائه درس (presentcourse) را تعریف می کنیم:
حال به کلاس student می رویم تا interface، Forstudent را implement کند. (با کلمه ی کلیدی implements ):
این کارها را برای کلاس teacher هم انجام می دهیم.
به محض تایپ اینها، علامت hint (تذکر) ظاهر می شود که رفتن موس روی آن پیغامی می دهد که می گوید بدنه ی متد abstract (این interface ) را در خود پیاده سازی کند همان عمل override می باشد :
این کار (override) را می توانیم به صورت دستی انجام دهیم و تایپ کنیم و یا اتوماتیک.

روش اتوماتیک (override) برای کلاس student :

با کلیک روی hint دو عمل را می توانیم انجام دهیم: یا متد abstract شده ( همان interface) رااینجا implement کنیم یعنی بدنه ی آن را اینجا پیاده سازی کنیم و یا خود این کلاس student را abstract تعریف کنیم. ما گزینه ی اول را انتخاب می کنیم:
وکدها به صورت زیر (کادر قرمز پایینی) وارد می شوند:
با کلیک روی دایره ی سبز در حاشیه سمت چپ، به خطی در کلاس interface می رود که در آنجا این متد به صورت abstract اعلان شده است. این قسمت مربوط به مبحث annotation ها است که بعدا به آن می پردازیم.

روش دستی(override) برای کلاس teacher :

کد هایی که در کادر قرمز مشخص شده در تصویر زیر را تایپ می کنیم:
دیدیم که متدهای یک interface همگی abstract هستند و پیاده سازی ندارند ولی یک کلاس abstract می تواند هیچ متد abstract ای نداشته باشد یا چند تا متد abstract داشته باشد و چند تا متد غیر abstract.

پایان بخش interface ها