در مهندسی نرمافزار موقعیتهای زیادی پیش میآید که گروههای مختلف برنامهنویس لازم است روی یک «قرارداد» به توافق برسند که جزئیات تعامل نرمافزارشان را مشخص میکند. هر گروه باید بتواند کد خود را بدون هیچگونه اطلاعاتی از نحوهی نوشتن کد گروه دیگر بنویسد. به طور کلی، Interfaceها دقیقاً همین قراردادها هستند.
مثلاً یک جامعهی آیندهنگر را تصور کنید که در آن ماشینهای رباتیک کنترلشده با کامپیوتر، مسافران را بدون اپراتور انسانی در خیابانهای شهر جابهجا میکنند. تولیدکنندگان خودرو نرمافزاری (طبیعتاً جاوا) مینویسند که خودرو را عملیات میکند — توقف، حرکت، شتابگیری، پیچیدن به چپ و غیره. یک گروه صنعتی دیگر، تولیدکنندگان ابزارهای راهنمای الکترونیکی، سیستمهای کامپیوتری میسازند که دادههای موقعیتی GPS (سیستم موقعیتیاب جهانی) و انتقال بیسیم شرایط ترافیکی را دریافت و از این اطلاعات برای هدایت خودرو استفاده میکنند.
تولیدکنندگان خودرو باید یک Interface استاندارد صنعتی منتشر کنند که بهطور دقیق مشخص کند چه متدهایی میتوانند فراخوانی شوند تا خودرو حرکت کند (هر خودرویی، از هر تولیدکنندهای). تولیدکنندگان راهنما سپس میتوانند نرمافزاری بنویسند که متدهای توصیفشده در Interface را برای فرمان دادن به خودرو فراخوانی کند. هیچکدام از دو گروه صنعتی نیازی ندارند بدانند نرمافزار گروه دیگر چگونه پیادهسازی شده است. در واقع، هر گروه نرمافزار خود را بسیار اختصاصی در نظر میگیرد و حق تغییر آن را در هر زمانی برای خود محفوظ میدارد، به شرطی که همچنان به Interface منتشرشده پایبند باشد.
در زبان برنامهنویسی جاوا، یک Interface نوع مرجعی (Reference Type) است، شبیه یک کلاس، که میتواند فقط شامل ثابتها، Signature متدها، Default Methodها، Static Methodها (private یا public، نه protected)، متدهای instance غیرانتزاعی (private، نه public، نه protected) و انواع تو در تو (Nested Types) باشد. بدنهی متدها فقط برای Default Methodها، متدهای private و متدهای static وجود دارد. Interfaceها قابل نمونهسازی نیستند — فقط میتوانند توسط کلاسها پیادهسازی یا توسط Interfaceهای دیگر گسترش داده شوند. بحث گسترش بعداً در این بخش ارائه خواهد شد.
تعریف یک Interface شبیه ایجاد یک کلاس جدید است:
public interface OperateCar {
// constant declarations, if any
// method signatures
// An enum with values RIGHT, LEFT
int turn(Direction direction,
double radius,
double startSpeed,
double endSpeed);
int changeLanes(Direction direction,
double startSpeed,
double endSpeed);
int signalTurn(Direction direction,
boolean signalOn);
int getRadarFront(double distanceToCar,
double speedOfCar);
int getRadarRear(double distanceToCar,
double speedOfCar);
......
// more method signatures
}
توجه کنید که Signature متدها براکت ندارند و با سمیکالن پایان مییابند.
برای استفاده از یک Interface، کلاسی مینویسید که آن Interface را پیادهسازی میکند. وقتی یک کلاس قابل نمونهسازی Interface را پیادهسازی میکند، برای هر یک از متدهای اعلانشده در Interface، بدنهی متد ارائه میدهد. مثال:
public class OperateBMW760i implements OperateCar {
// the OperateCar method signatures, with implementation --
// for example:
public int signalTurn(Direction direction, boolean signalOn) {
// code to turn BMW's LEFT turn indicator lights on
// code to turn BMW's LEFT turn indicator lights off
// code to turn BMW's RIGHT turn indicator lights on
// code to turn BMW's RIGHT turn indicator lights off
}
// other members, as needed -- for example, helper classes not
// visible to clients of the interface
}
در مثال ماشین رباتیک بالا، این تولیدکنندگان خودرو هستند که Interface را پیادهسازی خواهند کرد. پیادهسازی Chevrolet طبیعتاً تفاوت قابلتوجهی با Toyota خواهد داشت، اما هر دو تولیدکننده به یک Interface پایبند خواهند بود. تولیدکنندگان راهنما که مشتریان Interface هستند، سیستمهایی میسازند که از دادههای GPS درباره موقعیت خودرو، نقشههای دیجیتال خیابان و دادههای ترافیکی برای هدایت خودرو استفاده میکنند. این سیستمهای راهنما متدهای Interface را فراخوانی میکنند: چرخش، تغییر خط، توقف، شتابگیری و غیره.
---مثال ماشین رباتیک نشان میدهد Interface به عنوان رابط برنامهنویسی کاربردی (Application Programming Interface — API) استاندارد صنعتی استفاده میشود. APIها در محصولات نرمافزاری تجاری هم رایج هستند. معمولاً یک شرکت بستهی نرمافزاری میفروشد که متدهای پیچیدهای دارد و شرکت دیگری میخواهد آنها را در محصول نرمافزاری خودش استفاده کند.
در حالی که API شرکت پردازش تصویر عمومی است (برای مشتریانش)، پیادهسازی API بهعنوان رازی محرمانه حفظ میشود — در واقع ممکن است در زمان بعدی پیادهسازی را بازنگری کند تا زمانی که همچنان Interface اصلیای که مشتریانش به آن وابسته بودهاند را پیادهسازی کند.
Interfaceها نوعهای مرجع همهکارهای هستند که به شما اجازه میدهند Methodهای default تعریف کنید و بدون شکستن کلاسهای پیادهساز، قابلیت به نوع خاصی اضافه کنید. علاوه بر این، گاهی میتوانید بخشهای مشترک کد را در متدهای private استخراج کنید و بدین ترتیب تکرار کد در متدهای default را کاهش دهید. آموزش بعدی در این مجموعه را بررسی کنید تا اطلاعات بیشتری درباره تعریف متدها درون Interface به دست آورید.
اعلان یک Interface شامل ویرایشگرها، کلمهکلیدی interface، نام Interface، لیستی جداشده با کاما از Interfaceهای والد (در صورت وجود)، و بدنهی Interface است. مثال:
public interface GroupedInterface extends Interface1, Interface2, Interface3 {
// constant declarations
// base of natural logarithms
double E = 2.718282;
// method signatures
void doSomething (int i, double x);
int doSomethingElse(String s);
}
ویرایشگر دسترسی public نشان میدهد Interface میتواند توسط هر کلاسی در هر پکیجی استفاده شود. اگر عمومی بودن Interface را مشخص نکنید، Interface فقط برای کلاسهایی در همان پکیج Interface قابل دسترسی خواهد بود.
Interface میتواند از Interfaceهای دیگر ارث ببرد، درست مثل اینکه یک کلاس میتواند از کلاس دیگری Subclass یا Extend شود. اما در حالی که یک کلاس فقط از یک کلاس دیگر میتواند ارث ببرد، یک Interface میتواند از هر تعداد Interface ارث ببرد. اعلان Interface شامل لیستی جداشده با کاما از تمام Interfaceهایی است که از آنها ارث میبرد.
Interface میتواند شامل ثابتها، Signature متدها، Default Methodها، Static Methodها (private یا public، نه protected)، متدهای instance غیرانتزاعی (private، نه public، نه protected) و انواع تو در تو باشد.
Abstract Method درون Interface با سمیکالن ادامه مییابد اما بدون براکت (Abstract Method حاوی پیادهسازی نیست).
Default Methodها با ویرایشگر default و Static Methodها با کلمهکلیدی static تعریف میشوند. تمام متدهای abstract، default و static در یک Interface بهصورت ضمنی public هستند، بنابراین میتوانید ویرایشگر public را حذف کنید.
علاوه بر این، Interface میتواند شامل اعلان ثابتها باشد. تمام مقادیر ثابت تعریفشده در Interface بهصورت ضمنی public، static و final هستند. باز هم میتوانید این ویرایشگرها را حذف کنید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/