View Full Version : فرق Interface با absteract class
archi
سه شنبه 29 اردیبهشت 1383, 11:50 صبح
سلام من تو چند تا کتاب مفهوم Interface رو خوندم ولی فرقشو با Absract class نفهمیدم . کسی میتونه با یه مثال توضیح بده؟
Abbas Arizi
سه شنبه 29 اردیبهشت 1383, 12:08 عصر
این دو از جهات زیادی به هم شباهت دارن و یکی از وجوه بارز اونها پیادهسازی مفهوم چند ریختی است ولی تفاوت اونها در اینه که اینترفیس هیچ گونه پیادهسازی متدی نداره ولی در کلاس Abstarct فقط متدهای Abstract پیاده سازی ندارند ولی سایر متدها میتوانند تعریف شوند.
همچنین کلاس Abstract همانند سایر کلاسها به ارث میرسد و تنها متدهای Abstarct باید Override بشوند ولی برای اینترفیس این گونه نیست و اینترفیسها باید به طور کامل در یک کلاس پیادهسازی شوند.
اَرژنگ
پنج شنبه 01 آذر 1386, 06:56 صبح
دلایل استفاده از Interface و Absract class به اندازهای از هم متفاوتند که لیست کردن فرقهاشان مانند لیست کردن فرقهایه پیچگوشتی با آچار فرانسه میماند. اگرچه میشه با هر دوشان میخکوبید ولی اینکه بخواهیم فرقهاشان را به این سورت لیست کنیم معنی نمیده.
Interface برایه نشان دادن قابلیتها است. اینکه یک کلاس چه قابلیتهایی دارد.
Absract class برایه نشان دادن نوع کلاس است.
برایه مثال درخت باینری ، از نوع درخت است،دو تا از قابلیتهاش این است که نُدهاش را یکی یکی از کم به زیاد لیست کند یا خودش را سورت کند.
برایه همین اینکه درخت باینری از یک کلاس ابسترکت کلاس "درخت" به ارث ببره و اینترفیسهایه ISortable و IEnumerable را پیاده سازی کند به نظر درست میاد.
حالا میشه در مورد کلی نکات بیربط دیگر یک Interface با یک Abstract Class فرق پیدا کرد ولی هر کدام برایه بیان کردن مفاهیم کاملا مختلفی استفاده میشند.
در ضمن شباهتی که بیان شده "و یکی از وجوه بارز اونها پیادهسازی مفهوم چند ریختی است " مفهوم چند ریختی یک نوع نیست، چندین نوع مختلف است، اینترفیس برایه بیان کردن قابلیتهایه چندریختی است و ابسترکت کلاس برایه بیان کردن نوع هایه چند ریختی. پس در اصل این شباهتشان نیست بلکه فرق اصلیشان است.
hassan razavi
پنج شنبه 01 آذر 1386, 12:12 عصر
با کسب اجازه از اساتید.
من توی این بحث شرکت میکنم چون می خواهم اطلاعاتی رو که توی ذهنم دارم و رو بیان کنم ، تا اگه اشتباه هست و مشکلی داره دوستان اصلاح کنند و در نتیجه به اطلاعات صحیح برسم. مثل موضوعی که درباره Singleton بود و دوست بسیار عزیز و دانایم جناب ارژنگ من رو راهنمایی کردند.
یکی فرق بین Interface و Abstract Class اینهست که ، Abstract همینطور که از اسمش پیداست یک کلاس هست ولی Interface یک قانون هست که مشخص میکند که یک کلاس چطوری باید پیاده سازی شود. یک کلاس فقط از یک کلاس Abstract می تواند ارث بپذیرد ولی از n تا interface می تواند ارث ببرد.
در یک interface نمی توان متد را پیاده سازی کرد و یا حتی variables/constants را تعریف کنید ولی در Abstract می توانید.
فرق مهم یک Abstract Class با یک Class این است که شما نمی توانید از یک Abstract Class نمونه سازی کنید (Instance) .
اَرژنگ
پنج شنبه 01 آذر 1386, 13:39 عصر
با کسب اجازه از اساتید.
من توی این بحث شرکت میکنم چون می خواهم اطلاعاتی رو که توی ذهنم دارم و رو بیان کنم ، تا اگه اشتباه هست و مشکلی داره دوستان اصلاح کنند و در نتیجه به اطلاعات صحیح برسم. مثل موضوعی که درباره Singleton بود و دوست بسیار عزیز و دانایم جناب ارژنگ من رو راهنمایی کردند.
یکی فرق بین Interface و Abstract Class اینهست که ، Abstract همینطور که از اسمش پیداست یک کلاس هست ولی Interface یک قانون هست که مشخص میکند که یک کلاس چطوری باید پیاده سازی شود. یک کلاس فقط از یک کلاس Abstract می تواند ارث بپذیرد ولی از n تا interface می تواند ارث ببرد.
در یک interface نمی توان متد را پیاده سازی کرد و یا حتی variables/constants را تعریف کنید ولی در Abstract می توانید.
فرق مهم یک Abstract Class با یک Class این است که شما نمی توانید از یک Abstract Class نمونه سازی کنید (Instance) .
با سلام خدمت جناب رضوی، لطف دارید :)
این فرقهایی که بیان کردید همه درست هستند، ولی سوال واقعی اصلا چیزه دیگریست.
من هم مدتها همین فرقها را به عنوان فرقهایه بینشان فکر میکردم ولی بازهم از این جواب راضی نبودم.
سوال واقعی این نیست که فرق بینشان چی هست، چونکه بین دو ابزار مختلف (مانند پیچگوشتی و آچار فرانسه) فرق زیاد میشه پیدا کرد ولی فایده این نوع تفاوت گذاری بین دو ابزار که هر کدام برایه کاره بخصوصی استفاده میشند . فایدهای نداره!
باید پرسید که اینترفیس را برایه چه کاری استفاده میکنیم؟ و ابسترکت کلاس را برایه چه کاری؟
پلیمرفیزم (چند شکلی بودن) نوعهایه متفاوت دارد.
برنامه نویسی در حقیقت یک روش ساختن مدل هست. در ساخن مدل باید بشه ابراز کرد که اشیائ مختلف در مدل به همدیگر چه رابطهای دارند.
Type Polymorphism : برایه ابراز جابجایی نوعی هست. مثالا یک درخت سیب از نوع درخت هستش ولی درخت یک ابسترکت کلاس تعریف شده
Interface Polymorphisim: برایه ابراز جابجایی قابلیت است. اینکه یک لیست داریم و یا یک گراف مهم نیست، اگر هردوشان IEnumerable را پشتیبانی میکنند بدانه دانستن نوعشان میتوانیم از هر دو از طریق قابلیت IEnumarable درخواست کنیم که یکی یکی عضوهاشان را برگردانند.
سوال "فرق بین اینترفیس و ابسترکت کلاس چی هست؟" بیمعنیه.
باید پرسید که برایه چه دلایلی از اینترفیس استفاده میشه و برایه چه دلایلی از ابسترکت کلاس.
اینکه یکی قابلیت پیاده ریزی داره و یا نه ، یا اینکه میشه یکیش را یکبار ارث برد و دیگری را چندین بار، مانند مقایسه کردن فرقهایه فیل و فنجان است.
یک کلاس درست است که از یک ابسترکت کلاس میتواند ارث ببرد ولی وقتی که در مورد اینترفیس حرف میزنیم باید واژههایمان را عوض کنیم.
یک کلاس میتواند که ابراز کند که چه اینترفیسهایی را پشتیبانی میکند (نه اینکه ارث میبرد).
پشتیبانیه یک کلاس از یک اینترفیس و یا ارث بریش از یک ابسترکت کلاس دیدهایه متفاوتی را بین یک کلاس و کلاسهایه دیگر و قابلیتهاش با قابلیتهایه کلاسهایه دیگر که از نظر نوعی به هم هیچ ربطی ندارند را مهیا میکند.
mostafa_shaeri_tj
یک شنبه 28 شهریور 1389, 00:32 صبح
سلام.
یه سوالی برام پیش اومده : چرا c# از ارث بری چندگانه پشتیبانی نمیکنه؟ این یک نقصه ؟
vBulletin® v4.0.8, Copyright ©2000-1391, Jelsoft Enterprises Ltd.