«رابط» یک نوع است که اعضایی را در خود دارد که گروهی از کارکردهای مرتبط را تعریف میکنند. این نوع، نحوهی استفاده از یک کلاس را از پیادهسازی آن جدا میکند و امکان چندین پیادهسازی متفاوت یا پشتیبانی از رفتارهای عمومی مانند قالببندی، مقایسه یا تبدیل را فراهم میآورد.
نحوهی نگارش یک رابط شبیه به نحوهی نگارش یک کلاس یا ساختار است، با این تفاوت که متدها و ویژگیها فقط بهصورت امضا ظاهر میشوند و بدنهای برایشان ارائه نمیشود.
public interface ILanguage
{
string LanguageName { get; set; }
string Speak();
}
public class ItalianTaveller : ILanguage, ICloneable
{
public string LanguageName { get; set; } = "Italiano";
public string Speak()
{
return "Ciao mondo";
}
public object Clone()
{
ItalianTaveller it = new ItalianTaveller();
it.LanguageName = this.LanguageName;
return it;
}
}
همهی عملیات تعریفشده در رابط باید پیادهسازی شوند.
رابطها میتوانند علاوه بر دیگر اعضا، متدها و ویژگیهای نمونهای هم داشته باشند
برای اینکه بتوان یک شیء را با شیء دیگری مقایسه کرد، باید رابط IComparable<T> را پیادهسازی کند.
این رابط یک متد دارد که باید پیادهسازی شود: int CompareTo(T other).
مقدار بازگشتی متد CompareTo میتواند یکی از سه حالت زیر باشد:
در این تمرین کمی بیشتر روی خودروهای کنترل از راه دور کار میکنید.
یک خودروی آزمایشی توسعه یافته است و پیست آزمون باید طوری تغییر کند که بتواند هم مدلهای تولیدی و هم مدلهای آزمایشی را پشتیبانی کند. هر دو نوع خودرو از قبل ساخته شدهاند و باید راهی پیدا کنید که هر دو را در پیست آزمون مدیریت کنید.
علاوه بر این، خودروهای تولیدی کمکم دارند به موفقیتهایی دست پیدا میکنند. رئیس تیم مشتاق است با انتشار رتبهبندی خودروهای تولیدی، روح رقابت را حفظ کند.
لطفاً متدی به رابط IRemoteControlCar اضافه کنید تا پیادهسازیهای Drive() برای هر دو نوع خودرو در دسترس قرار گیرد.
TestTrack.Race(new ProductionRemoteControlCar());
TestTrack.Race(new ExperimentalRemoteControlCar());
// this should execute without an exception being thrown
لطفاً ویژگیای به رابط IRemoteControlCar اضافه کنید تا پیادهسازیهای ویژگی DistanceTravelled برای هر دو نوع خودرو در دسترس قرار گیرد.
var prod = new ProductionRemoteControlCar();
TestTrack.Race(prod);
var exp = new ExperimentalRemoteControlCar();
TestTrack.Race(exp);
prod.DistanceTravelled
// => 10
exp.DistanceTravelled
// => 20
لطفاً رابط IComparable<T> را در کلاس ProductionRemoteControlCar پیادهسازی کنید. ترتیب مرتبسازی پیشفرض خودروها باید صعودی و بر اساس تعداد پیروزیها باشد.
متد استاتیک TestTrack.GetRankedCars() را پیادهسازی کنید تا خودروهای دادهشده را به ترتیب صعودی تعداد پیروزیها برگرداند.
var prc1 = new ProductionRemoteControlCar();
var prc2 = new ProductionRemoteControlCar();
prc1.NumberOfVictories = 3;
prc2.NumberOfVictories = 2;
var rankings = TestTrack.GetRankedCars(prc1, prc2);
// => rankings[1] == prc1