نوشته شده توسط
cups_of_java
این چیزی که شما می گی ذاتن مفهوم Generalization هست که به طور خاص همون Inheritance می شه. فرق Abstract Class و Interface رو از نظر کاریردی اشاره نکردی. بیشتر فکر کن!
حرف های آقا مهدی هم در مورد Patternها متین و به جا هستش.
interface هر موقع که بخواهیم رفتارهایی رو به یک کلاس تحمیل کنیم از interface استفاده می کنیم. تعریف interface همینه. یعنی اینکه یک کلاس وقتی از یک inteface استفاده کرد باید تمام method های اون رو Implement یا پیاده سازی کنه.
تفاوت Interface با یک abstract class
تمام method های یک Interface بصورت abstract هستند ولی در abstract کلاس می تواند چنین نباشد.
abstract کلاس دارای constructor هست ولی Interface نیست.
وراثت چند گانه در abstract کلاس ها نیست ولی در interface هست.
شباهت: هر دو غیر قابل Instance یا همان new شدن هستند.
یک کلاس معمولی می تواند از چندین interface استفاده کند در صورتی که فقط از abstract کلاس می تواند استفاده کند.
حل مشکل وراثت چندگانه در java بر خلاف C++
مثال یک کلاس abstract حیوانات در نظر بگیرید و همچنین دو کلاس خر و قورباغه که هر دو از این کلاس پدر که مثلا شامل دو method حرف زدن و راه رفتن هست ارث بردند. خب معلومه خر ار ار می کنه و چهار دست و پا راه می ره و قورباغه قور قور می کنه و می جهه حالا کلاس آدم رو در نظر بگیر که خودش زیر مجموعه کلاس حیوان هست بیاد و از دو کلاس خر و قورباغه ارث بری کنه یعنی وراثت چند گانه که در ++C هست و خیلی ها فکر می کنند خیلی خوبه.
نتیجه دو متد راه رفتن و حرف زدن در هر دو کلاس پدر برای آدم به دو جور متفاوت تعریف شده حالا آدم چهار دست و پا راه می ره یا می جهه آدم باید ار ار کنه یا قور قور ؟
راه حل وجود interface هست که می تونه این مشکل رو حل کنه چرا چون تمام متدود های تعریف شده در اون دارای تعریف هیچ رفتاری نیست یعنی وجود رفتار هست و چگونگی اون معلوم نیست پس می توان برای هر کلاس بصورت مجزا تعریف بشه.
مثال بعدی رو با این شروع می کنم که فرض کنید که یک interface دارید که تعریف عمل پرواز توش وجود داره اما چون چگونگی این عمل تعریف نشده خیلی راحت کلاس هواپیما و کلاس مگس می تونند از این Interface استفاده کنند و عمل پرواز رو برای خودشون تعریف کنند.
خوب سوال : بابا این چه کاریه از همون اول خودمون می آیم همه کلاس ها رو طوری در نظر می گیریم که نیازی به interface نباشه. مثلا توی مثل دومی مگس رو جدا می گیرم و هواپیما رو جدا
نکته: در زبان جاوا هر کلاس یا کلاس هایی که از یک یا چند Interface استفاده کرده باشند این خاصیت رو بصورت runtime به ما می ده که بجای اینکه از خود نوع کلاس یک instance داشته باشیم از خود کلاس و از نوع Interface اون یک instance داشته باشیم که بسیار کاربردی هست
مثال
public interface Animals {
public void talk();
public void walk();
}
public class Human implements Animals {
public void talk() {
System.out.println("like a human");
}
public void walk() {
System.out.println("like a human");
}
public class Donkey implements Animals {
public void talk() {
System.out.println("like a donkey");
}
public void walk() {
System.out.println("like a donkey");
}
نکته در چگونگی استفاده از آن
public class Use {
public static void main(String[] st) {
Animals human = new Human();
human.talk();
Animals donkey = new Donkey();
donkey.walk();
}
}
سوال: بابا باز این چه کاریه خوب از همون اول می نوشتیم داستان رو دیگه بصورت جدا و بعدشم بصورت جدا از interface می اومدیم instance می گرفتیم مثل آدم.
جواب: یک ضبط ماشین رو در نظر بگیرید همراه با face اون ضبط.
آیا شما که در ماشنتون نشستید هیچ اطلاعایی از چگونگی پیاده سازی ضبط ماشینتون دارید؟
مثالا می تونید از چندتا ترانزیستور و و و درست شده ؟ معلومه که نه ولی یک face دارید که روی اون face چند تا دکمه هست که وقتی اون دکمه ها رو می زنید یک سری فرامین اجرا می شه مثلا می خونه یا جلو یا به عقب بر می گرده مهم داستان اینکه که اگر شما پشت قضیه رو عوض کنی داستان باز با این face کار می کنه مثلا شرکت X یک جور طراحی می کنه با این face و شرکت Y یک جور دیگه ولی شما چون با این face کار می کنید متوجه او پشت نمی شید.
جریان Interface هم به این حالته برای شما، در مثال من دیدین که شما فقط کافی هست که Interface رو داشته باشید و اون وقت بصورت مختلف از این Interface نتیجه های گوناگون بگیرید.
کلی کاربرد دیدید که می شه از Interface و کلا بحث abstraction استفاده کرد.
اگر دیدتون بصورت componentی باشه تا objectی اون موقع کلی بحث هست برای این موضوع.
اما مهمترین قسمت و پر کاربرد ترین قسمت بحث dependency injection هست که باز بر می گرده به بحث component ها و service ها .
که من وارد این معقوله نمی شم. و می زارم به عهده خودتون که ببینم که علاقه داره بعدا در موردش بحث می کنیم.