Interface چیست؟
ارث بردن از یک کلاس، مکانیزم قدرتمندی است اما قدرت واقعی وراثت از ارث بردن از یک Interface می آید. Interface ها دلیل اصلی وجود وراثت هستند. یک Interface به شما امکان می دهد تا اسم متد را کاملا از پیاده سازی آن جدا کنید. Interface به شما می گوید که اسم متد چیست. این که متد چگونه پیاده سازی شود به Interface مربوط نیست.
مَخلص کلام این که اگه خواستیم که کلاس های ما از یک سری قوانین خاص پیروی کنند، یک Interface تعریف نموده و کلاس ها از آن به ارث برده می شوند.
روی نام سولوشن کلیک راست کرده و از گزینه ی Add گزینه ای به نام Interface را انتخاب کرده و نامی برای آن در نظر میگیریم. طبق استاندارد مایکروسافت دو حرف اول آن را بزرگ در نظر میگیریم هم چنین حرف اول آن باید I باشد. و درون آن فقط یک متد تعریف می کنیم.
interface ITest
{
string Test();
}
سه کلاس به نام های Student وPersonوTeacher ایجاد میکنیم. و در Student کد زیر را مینویسیم تا این کلاس از Interface ارث برده شود.
//student class
class
Student:ITest
{
#region ITest Members
public string Test()
{
return "student";
}
#endregion
}
بعد از نوشتن نام Interface یک علامت زیر آن ایجاد می شود(همان قسمتی که با فلش مشخص شده) که اگر روی آن ماوس را نگه داریم دو گزینه ظاهر می شود و ما گزینه اول را که Implement می باشد را انتخاب میکنیم . مشاهده میکنیم که یک متد هم نام همان متدی که در Interface تعریف کرده بودیم ایجاد میشود. ما نمیتوانیم نوع برگشتی متد را در این قسمت تغییر دهیم چون باید از قوانین Interface پیروی کنیم.
برای سایر کلاس ها هم همین کار رو انجام می دهیم و به جای کدی که درون متد ایجاد می شود کد مورد نظر خودمان را قرار می دهیم.
//teacher class
class Teacher : ITest
{
#region ITest Members
public string Test()
{
return "teacher";
#endregion
}
}
//Person class
class Person:ITest
{
#region ITest Members
public string Test()
{
return "Person";
}
#endregion
}
حالا در متد main برنامه کد زیر را جهت نمایش می نویسیم.
class Program
{
static void Main(string[] args)
{
Person Person_1 = new Person();
Student Student_1 = new Student();
Teacher Teacher_1 = new Teacher();
object[] List = new object[] { Person_1, Student_1, Teacher_1 };
foreach (ITest II in List)
{
Console.WriteLine(II.Test());
}
Console.ReadKey();
}
می توانیم به جای استفاده از حلقه ی Foreach برای نمایش مقادیر، کد زیر را بنویسیم.
Console.WriteLine(Person_1.Test());
Console.WriteLine(Student_1.Test());
Console.WriteLine(Teacher_1.Test());
مشابه مفهوم Interface مفهوم دیگری به نام Abstract وجود دارد. یک کلاس جدید به وجود می آوریم و فقط قبل نام آن کلمه ی Public abstract را قرا ر می دهیم. مانند سایر کلاس ها سه پراپرتی برای آن تعریف نموده و پراپرتی سوم که جهت نمایش نام و نام خانوادگی است را abstract میکنیم.
public abstract class Person
{
public string Name { get; set; }
public string Family { get; set; }
public abstract string FullName { get; set; }
}
حالا در متد Main یک شی ء از کلاس Person می سازیم. اما با خطا مواجه می شود، مبنی بر این که نمی توان یک نمونه یا یک آبجکت از یک abstract class یا یک Interface ساخت. چرا؟چون این کلاس انتزاعی است و دلیلی ندارد که از آن آبجکت ساخته شود . بلکه باید کلاس دیگری ایجاد کرد که از کلاس Person به ارث رفته است.
class Student:Person
{
public override string FullName
{
get
{
return string.Format("{0}{1}", Name, Family);
}
set
{
throw new NotImplementedException();
}
}
}