«رابط» یک نوع است که اعضایی دارد که گروهی از قابلیتهای مرتبط را تعریف میکنند. این کار فاصلهی بین استفاده از یک کلاس و پیادهسازی آن را ایجاد میکند و امکان چندین پیادهسازی متفاوت یا پشتیبانی از رفتار عمومی مانند قالببندی، مقایسه یا تبدیل را فراهم میکند.
نحوهی نگارش رابط مشابه کلاس است، با این تفاوت که متدها فقط به صورت امضا ظاهر میشوند و بدنهی آنها ارائه نمیشود.
public interface Language {
String getLanguageName();
String speak();
}
public class ItalianTraveller implements Language, Cloneable {
// from Language interface
public String getLanguageName() {
return "Italiano";
}
// from Language interface
public String speak() {
return "Ciao mondo";
}
// from Cloneable interface
public Object clone() {
ItalianTraveller it = new ItalianTraveller();
return it;
}
}
کلاس پیادهساز باید همهی عملیات تعریفشده در رابط را پیادهسازی کند.
رابطها معمولاً شامل متدهای نمونه هستند.
نمونهای از رابط در کتابخانهی کلاسهای Java، علاوه بر Cloneable که در بالا نشان داده شد، Comparable<T> است.
رابط Comparable<T> را میتوان در جایی پیادهسازی کرد که به یک ترتیب مرتبسازی عمومی پیشفرض در مجموعهها نیاز باشد.
در این تمرین کمی بیشتر روی خودروهای کنترل از راه دور کار میکنید.
یک خودروی آزمایشی ساخته شده است و پیست آزمایش باید طوری تغییر کند که بتواند هم مدلهای تولیدی و هم مدلهای آزمایشی را پشتیبانی کند. هر دو نوع خودرو قبلاً ساخته شدهاند و باید راهی پیدا کنید که در پیست آزمایش با هر دوی آنها کار کنید.
علاوه بر این، خودروهای تولیدی کمکم موفقیتهایی به دست میآورند. رئیس تیم مشتاق است با انتشار رتبهبندی خودروهای تولیدی، روحیهی رقابتی را حفظ کند.
لطفاً دو متد به رابط RemoteControlCar اضافه کنید:
drive() که چیزی برنمیگرداند،getDistanceTravelled() که یک int برمیگرداند.سپس کاری کنید که ProductionRemoteControlCar و ExperimentalRemoteControlCar رابط RemoteControlCar را پیادهسازی کنند.
این کار شامل پیادهسازی همهی متدهایی است که رابط نیاز دارد.
هر بار فراخوانی .drive() باید باعث شود خودرو مسافت مشخصی را طی کند:
ProductionRemoteControlCar به اندازهی ۱۰ واحد حرکت میکند،ExperimentalRemoteControlCar به اندازهی ۲۰ واحد حرکت میکند.متد .getDistanceTravelled() باید تعداد واحدهایی را برگرداند که خودرو در طول عمر خود طی کرده است.
ProductionRemoteControlCar prod = new ProductionRemoteControlCar();
prod.drive();
prod.getDistanceTravelled();
// => 10
ExperimentalRemoteControlCar exp = new ExperimentalRemoteControlCar();
exp.drive();
exp.getDistanceTravelled();
// => 20
متد TestTrack.race(RemoteControlCar car) را پیادهسازی کنید که در آن carها drive() میکنند.
TestTrack.race(new ProductionRemoteControlCar());
TestTrack.race(new ExperimentalRemoteControlCar());
// this should execute without an exception being thrown
لطفاً رابط Comparable<T> را در کلاس ProductionRemoteControlCar پیادهسازی کنید.
ترتیب مرتبسازی پیشفرض خودروها باید نزولی بر اساس تعداد پیروزیها باشد.
متد ایستا TestTrack.getRankedCars() را پیادهسازی کنید تا خودروهای ورودی را به ترتیب نزولی تعداد پیروزیها برگرداند.
ProductionRemoteControlCar prc1 = new ProductionRemoteControlCar();
ProductionRemoteControlCar prc2 = new ProductionRemoteControlCar();
prc1.setNumberOfVictories(2);
prc2.setNumberOfVictories(3);
List<ProductionRemoteControlCar> unsortedCars = new ArrayList<>();
unsortedCars.add(prc1);
unsortedCars.add(prc2);
List<ProductionRemoteControlCar> rankings = TestTrack.getRankedCars(unsortedCars);
// => rankings.get(0) == prc2
// => rankings.get(1) == prc1