سلام امروز می خوام در مورد interface بنویسم و دلیل استفاده از اون رو با یه مثال خیلی راحت نشون بدم
حقیقت اینکه هستند افرادی که شیءگرایی رو یاد میگیرن ولی دنبال مفهوم interface نمیرن
اگر ما می خوایم به design pattern ها مسلط بشیم باید مفهوم کاملی از oop رو درک کنیم
در ضمن من در این پست از c# استفاده کردم طبیعتا هرزبانی که از oop پشتیبانی کنه مشکلی برای پیاده سازی این مثال نخواهد داشت
خب شروع می کنیم
ما می خوایم یه برنامه داشته باشیم که به صورت شیءگرا 2 تا رنگ سبز و قرمز رو در کنسول برای ما چاپ بکنه
اول این برنامه رو بدون استفاده از interface می نویسم:
class greenColor { public string coloring() { return "The color is Green"; } } class redColor { public string coloring() { return "The color is Red"; } }
class DoIt { public greenColor _color { get; set; } public DoIt(greenColor color) { _color=color; } public void PrintAndShow(){ Console.WriteLine(_color.coloring()); }
} class Program { static void Main(string[] args) { var colorInstance = new DoIt(new greenColor()); colorInstance.PrintAndShow(); } }
خب در این کد همه چی درست کار می کنه ولی اگه ما بخوایم از رنگ سبز که همون کلاس greenColor هست به رنگ قرمز که همون کلاس redColor هست تغییر رویه بدیم باید چیکار کنیم؟
در اون حالت باید کلاس DoIt رو تغییر بدیم و اگر برنامه ما بزرگ باشه نمی تونیم دستی اینکار رو بکنیم و مشکلات زیادی برامون بوجود میاد
اما راه حل چیه؟
راه جل استفاده از مفهوم interface هستش
حال کد بالا را با interface پیاده سازی می کنیم
public interface Icolor { string coloring(); } class greenColor : Icolor { public string coloring() { return "The color is : Green"; } } class redColor : Icolor { public string coloring() { return "The color is : Red"; } } class DoIt { public Icolor _color { get; set; } public DoIt(Icolor color) { _color = color; } public void PrintAndShow(){ Console.WriteLine(_color.coloring()); } } class Program { static void Main(string[] args) { var colorInstance = new DoIt(new redColor()); colorInstance.PrintAndShow(); } }
برای تعریف interface از کلمه کلیدی interface استفاده می کنیم
نکته قابل توجه این که در داخل interface اصلا کد رو پیاده سازی نمی کنیم(در واقع کاربرد interface هم تو همین ویژگیه) فقط تعاریف رو می نویسیم
بعد در کلاس دیگری که از interface ارث بری می کنه کد مخصوص به اون کلاس رو پیاده سازی می کنیم
این امر چه کمکی میکنه؟
دیگه نیازی نیست که کلاس DoIt رو تغییر بدیم همین!
الان وقتی داریم colorInstance رو می سازیم مشخص می کنیم که DoIt کدوم باید از کدوم پیاده سازی interface استفاده کنه و تمام!
شاید گنگ نوشتم شایدم نه ولی حتما چندتا مقاله دیگه بخونید
این مقاله رو مطالعه کنید چون قطعا بهتر از من توضیح داده و در کنار اون abstract class رو هم گفته
خدانگهدار