PDA

View Full Version : سوال: در خواست توضیح بسیار ساده از interface



omidjadidolislam
چهارشنبه 15 خرداد 1387, 13:47 عصر
سلام
آقا به طور ساده یا با مثال ساده ،کسی میتونه interface را به من بگه ،آیا کد ساده ای برای درک
این مطلب کسی نوشته؟

H2K
چهارشنبه 15 خرداد 1387, 13:51 عصر
Click here to to view linke
http://msdn.microsoft.com/en-us/library/87d83y5b(VS.80).aspx

linux
چهارشنبه 15 خرداد 1387, 16:33 عصر
سلام
آقا به طور ساده یا با مثال ساده ،کسی میتونه interface را به من بگه ،آیا کد ساده ای برای درک
این مطلب کسی نوشته؟
اینترفیس یک الگویی هست که مشخص می کنه یک کلاس چه توابعی را باید پیاده سازی کند ولی در موردنحوه پیاده سازی آن چیزها صحبت نمی کند.

omidjadidolislam
پنج شنبه 16 خرداد 1387, 17:34 عصر
آقا باز نفهمیدم اگه ممکنه بیشتر بفرمایید زیرا ما میتوانیم توابع را در خود کلاس بنویسیم پس اینترفیس ها چکاره اند؟

mohammad272005
جمعه 17 خرداد 1387, 00:06 صبح
1- در ارث بري فقط از يك كلاس مي توان ارث برد، ولي در ارث بري از interfaceها اين محدوديت وجود ندارد.
2- interface تضمين مي كنه كه كلاسي كه ازش ارث برده، حتما memeber موجود در interface رو داره

اَرژنگ
جمعه 17 خرداد 1387, 04:37 صبح
استفاده از اینترفیس به اینکار میاد که شما نمیخواهید بگید که با چه شئی بخصوصی کار میکنید، فقط برایتان مهم است که این شئی چه قابلیتهایی دارد.
مفهوم ارث بری برایه اینترفیس بی معنی است، متاسفانه کمبود قدرت زبان آدمیزاد (چه انگلیسی و چه فارسی) کلمه بهتری ندارد. به جایه ارث بری باید به اینکه شئی مورد نظر از چه اینترفیسهایی پشتیبانی میکند را بهش توجه کنید.

در زندگی شما بدانه اینکه متوجه باشید از اینترفیسها استفاده میکنید. برایه مثال فکر کنید احتیاج دارید که یک چیزی را پرتاب کنید، خیلی چیزها قابلیت پرتاب شدن دارند (از پرتاب شدن ارث نمیبرند بلکه قابلیت پرتاب شدن را پشتیبانی میکنند). حالا اینکه جنسشان چی هست مهم نیست (سنگ، طلا ، چوب ، سیب زمینی، گوجه فرنگی...).

در برنامه نویسی، فرض کنید میخواهید یک پلاگین بنویسید، اینکه چه کلاسی برایه پیاده سازی استفاده شده و از چه کلاسی ارث برده مهم نیست. فقط اینکه از قابلیتهایه پلاگین را پشتیبانی میکند برای کلاینت مهم است و بس.

اَرژنگ
جمعه 17 خرداد 1387, 04:43 صبح
1- در ارث بري فقط از يك كلاس مي توان ارث برد، ولي در ارث بري از interfaceها اين محدوديت وجود ندارد.
2- interface تضمين مي كنه كه كلاسي كه ازش ارث برده، حتما memeber موجود در interface رو داره
شماره ۲ که گفتید کاملا فواید اینترفیس را بیان میکند.

شماره ۱، یک روش نگاه اشتباه به این موضوع است که به جز سردرگمی فایده ‌دیگری ندارد، اگرچه سینتکس بیان کردن اینکه کلاس از چه اینترفیسی پشتیبانی میکند (پیاده میکند) با سینتکس اینکه کلاس از چه کلاسی ارث میبرد یکی است، هر دو مباحث کاملا جدا گانه‌ای هستند و نباید با هم قاطی بشند.

قبلا در این مورد یک پست فرستاده بودم: http://barnamenevis.org/forum/showthread.php?t=7922

omidjadidolislam
دوشنبه 20 خرداد 1387, 12:34 عصر
سلام
تورو خدا یکی با یه مثال و کد ان ارزش استفاده از interface را به من بگه؟که بفهمم اگراز آن استفاده نکنم چه از دست دادم

Behrouz_Rad
دوشنبه 20 خرداد 1387, 12:57 عصر
آرژنگ که خوب توضیح داد. اگر ازش استفاده نکنی چیز مهمی که پروژت رو بخوابونه از دست نمیدی اما اگر ازش استفاده کنی چیزی رو به دست میاری!
توضیح در مورد interface فقط با ذکر مثال در دنیای واقعی امکان پذیره.
مثلا فرض کن قرار هست که دیتابیس سیستمت در آینده تغییر کنه، مثلا از SQL Server بشه MySql !
در اینترفیس متدها و خواص عمومی که بین تمامی RDBMS ها یکسان هست رو تعریف می کنی (مثل حداکثر زمان Cache، مقدار Connection String و ...) تا کلاس های لایه ی DAL این اینترفیس رو پیاده سازی کنن که یادت! نره که بعضی چیزها هست که بین RDBMS ها یکسانه.
یا فرضا برای سیستم تصدیق هویت: می دونی که در چنین سیستمی چند تا عمل اصلی وجود داره. مثل login، logout (که هر دو متد هستند) و IsAuthenticated (آیا کاربر لوگین کرده و این یک خواص هست). نحوه ی پیاده سازی این سیستم تصدیق هویت مهم نیست. مهم اجزای ثابتی هست که یک سیستم تصدیق هویت برای کار خودش حتما به اونها نیاز داره. یعنی بین اون سیستم ها این اعمال مشترکه. بنابراین تو یادت! نمیره که در یک سیستم تصدیق هویت باید این متدها و خواص رو از طریق کلاس ها پیاده سازی کنی.
فکر کنم بهترین واژه ای که میشه برای interface در زبان فارسی قائل شد، واژه ی "یاد آور" هست!

موفق باشید.

سار
دوشنبه 20 خرداد 1387, 13:00 عصر
فرض كن ما Objectي داريم به نام سند.
به من بگو چه چيزهايي ميتونه سند باشه. مثلن نامه، فاكتور و ... .
ولي همه ي اونها در عنوان،‌تاريخ، شماره و احتمالن چند چيز ديگه مشترك هستن.
شما ميتونيد تو برنامه يك اينترفيس با عنوان سند داشته باشي(IDocument) و كلاسهايي مانند فاكتور رو از اون Inherit كني و باقي چيزهايي كه لازم داري رو اضافه كني.

البته مثال بهروز خان خيلي فني تر و جامع تر بود(مرسي بهروز خان).

اَرژنگ
دوشنبه 20 خرداد 1387, 13:12 عصر
سلام
تورو خدا یکی با یه مثال و کد ان ارزش استفاده از interface را به من بگه؟که بفهمم اگراز آن استفاده نکنم چه از دست دادم
استفاده از اینترفیس به برنامه‌تان قدرت بیان میده، به جایه اینکه بگید که از چه ابجت بخصوصی استفاده میکنید بهتان اجازه میده که بگید که به چه نوع قابلیتها کار میکنید.
این مفهوم مربوط به کد نیست، مربوط به این است که کد چه قابلیتهایی را باهاش کار میکند.
بهترین نمونه‌ای که میتوانید پیدا کنید در مورد ساختن پلاگین هست، اگر بخواهید پلاگین بسازید نمیتونید اعلام کنید که چه کلاسی را باید ازش ارث ببرند، شآید بقیه مجبور باشند از کلاسهایه دیگری ارث ببرند، ولی میتوانید اعلام کنید که چه اینترفیسی را باید پیاده کنند، و میتوانید با همان اینترفیس با کدهای دیگر ارتباط برقرار کنید.
در برنامه‌های کوچک که قرار نیست توسعه داده بشند و گروهایه مختلف روش کار کنند هیچ کمبودی نمیبینیدم ولی در در برنامه‌هایه پیچیده و چند گروهی همه با اینترفیسها با هم تبادل اطلاعات میکنند، چونکه اینترفیس مانند یک پروتکل (کنتراکت) میماند، شما نمیخواهید بدانید که چطوری کدشان را پیاده کردند، فقط اینکه از اینترفیسی که شما لازم دارید پشتیبانی میکنند، به این طریق برنامه ساده تر میشه و توسعه و نگهداریش ساده تر.
در برنامه نوسی کوچکترین قسمت کد نویسی است، اصل مطلب ساختن مدل و ساده نگهداشتنش است. اینترفیس قابلیت پیاده کردن این مفهوم را میده، اینکه کد چی هست مهم نییست، اینکه قابلیت چه کارهایی را دارد مهم است (همانطوری که شما وقتی به یک کلاس نگاه میکنید فقط به هر چی که پابلیک هست نگه میندازید، دانستن قسمتهای پرایوت ، پروتکتت ، اینترنال فقط وقتی به کار میاد که بخواهید مشکلی را همان کلاس حل کنید).
به ایین ترتیب شما میتوانید که به یکی یک اینترفیس بدید و بگید که هر چی نوشت مهم نیست اینکه اینترفیس شما را ارضا میکند بس است. در مورد کد بقیه هر چی کمتر بدانید بهتر فقط اینکه کاری را که ازش درخواست میکنید را انجام میده بس است.
اینترفیس کدهایی را که لازم ندارید درموردشان بدانید را سفارشی میکند.

MH2538
دوشنبه 20 خرداد 1387, 14:23 عصر
امیدوارم بدردت بخوره
http://prophic.ir/?p=54
http://prophic.ir/?p=55
http://prophic.ir/?p=56

اَرژنگ
دوشنبه 20 خرداد 1387, 14:44 عصر
امیدوارم بدردت بخوره
http://prophic.ir/?p=54
http://prophic.ir/?p=55
http://prophic.ir/?p=56

http://prophic.ir/?p=56اشتباه همیشگی را دوباره تکرار میکند، مقایسه بین abstract و Interface بیمعنی است، هر کدام برایه پیاده سازی مفاهیم مختلفی بکار میاند و مقیاسه کردنشان بجز ایجاد گمراهی فایده‌ دیگری ندارد.

۲ تا لینک دیگر جزعیات را بیان میکنند، اصل مطلب درک مفهومی است که اینترفیسس درش استفاده میشه و طرز استفاده از اینترفیس بسیار ساده میشه.

sinpin
سه شنبه 21 خرداد 1387, 00:55 صبح
هرچند كه همه ي دوستان بخوبي توضيح دادند، من هم از ديدگاه ديگري بيان ميكنم.

اينترفيس يك قرارداد بين سازنده كلاس (Class creator) و مصرف كننده ي كلاس (Class consumer) است.
اين قرارداد يكطرفه و جهت آن ثابت است :
يعني هميشه از سوي سازنده اعمال و مصرف كننده مجبور به رعايت آن است.

توجه داشته باشيد كه سازنده و مصرف كننده الزاما دو شخص مجزا نيستند و گاها (در پروژه هاي كوچك انفرادي) ممكنه هم سازنده و هم مصرف كننده خود شما باشيد.

بصورت خيلي كلي تر : اينترفيس يك واسط بين سرويس دهنده و سرويس گيرنده است.

MH2538
سه شنبه 21 خرداد 1387, 07:11 صبح
.
شتباه همیشگی را دوباره تکرار میکند، مقایسه بین abstract و Interface بیمعنی است، هر کدام برایه پیاده سازی مفاهیم مختلفی بکار میاند و مقیاسه کردنشان بجز ایجاد گمراهی فایده‌ دیگری ندارد.

۲ تا لینک دیگر جزعیات را بیان میکنند، اصل مطلب درک مفهومی است که اینترفیسس درش استفاده میشه و طرز استفاده از اینترفیس بسیار ساده میشه.

مقایسه تفاوت‌های این دو مورد به هیچ عنوان اشتباه نیست.
ضمن اینكه در مورد این تفاوت ها مطالب بسیار جامعی وجود دارد. ولی ظاهرا ً‌شما تنها مخالف بحث بر سر این تفاوت‌ها هستید.
منتظر ارائه مطالب شما در ارتباط با این موضوع هستم.

اَرژنگ
چهارشنبه 22 خرداد 1387, 03:48 صبح
.

مقایسه تفاوت‌های این دو مورد به هیچ عنوان اشتباه نیست.
ضمن اینكه در مورد این تفاوت ها مطالب بسیار جامعی وجود دارد. ولی ظاهرا ً‌شما تنها مخالف بحث بر سر این تفاوت‌ها هستید.
منتظر ارائه مطالب شما در ارتباط با این موضوع هستم.
دلیل استفاده از هر کدامشان برایه پیداه سازی مفهوم جداگانه‌ای است.
دلیل اینکه یکی از کلاس ارث میبره را بهش میگند :type polymorphism یعنی نوع یک کلاس را به یک کلاس دیگر ربط میدند. در زندگی این مانند یک میز چوبی است، جنسش با درختی که ساخته شده یکیست.
دلیل استفاده از اینترفیس برایه پیاده سازی interface polymorphism است. با این روش کلاسهایی که با هم هیچ ربط ندارند قابلیتهایه یکسان دارند.

هر کدام مانند یک ابزار برایه کاره بخصوصی استفاده میشند. در سی شارپ سینتکس استفاده ازشان یکیست و این ایده را که یک جوری بهم ربط دارند را به برنامه نویس میدند.

در بعضی در از زبانها از implement و inherits برایه نشان دادن فرق بین این دو مفهوم استفاده میکنند.

دلیل اینکه میگم نباید به فرقهاشان نگاه کرد این است که مانند نگاه کردن به فرقهایه دو چیزه کاملا بیربط میماند. به فرقها وقتی باید نگاه کرد که دو چیز از خیلی جهتها شبیه هم هستند.
در این موضوع هر دو یک ابزار کارند، و همانطوری کسی فرقهایه دو تا ابزار مختلف مانند پیچ گوشتی و آچار فرانسه را بیان نمیکند، بیان کردن فرقهایه بین interface و abstract class هم بیمعنی است که هیچ، باعث گمراهی و سر درگمی میشه.
اگرچه میشه با اچار فرانسه هم میخ کوبید ولی کسی چکش را با آچار فرانسه اشتباه نمیگره.

omidjadidolislam
سه شنبه 04 تیر 1387, 15:51 عصر
آقا بالاخره با بررسی بیشتر فهمیدم
از دوستان گرامی که محبت کردند و توضیحاتی دادند ممنون هستم
ولی
با یک مثال مطلب را روشن میکنم و کدی هم ضمیمه کرده ام
اصولا interface به زبان ساده یعنی دسته بندی توابع یک کلاس(مثلا کل تابعهای یک کلاس را در دو گروه(interface) قرار دادن)،بطوریکه اگه شما از این بعضی توابع دسته بندی شده در کلاس دیگری ارث ببرید آنوقت شما فقط به همه توابع آن کلاس دسترسی ندارید و فقط به یک دسته خاص از آنها دسترسی دارید
و در نهایت بگویم که شما میتوانید ا ز کلاسی را که دو اینترفیس را به ارث برده، فقط یک interface (یک دسته از توابع) از آن کلاس را new کنید و بنابراین بقیع توابع اضافی در آبجکت شما وجود ندارد

بهتره به کدی که ضمیمه کردم نگاه کنید تا از شر این توضیحات خلاص شوید

اَرژنگ
سه شنبه 04 تیر 1387, 17:16 عصر
آقا بالاخره با بررسی بیشتر فهمیدم
از دوستان گرامی که محبت کردند و توضیحاتی دادند ممنون هستم
ولی
با یک مثال مطلب را روشن میکنم و کدی هم ضمیمه کرده ام
اصولا interface به زبان ساده یعنی دسته بندی توابع یک کلاس(مثلا کل تابعهای یک کلاس را در دو گروه(interface) قرار دادن)،بطوریکه اگه شما از این بعضی توابع دسته بندی شده در کلاس دیگری ارث ببرید آنوقت شما فقط به همه توابع آن کلاس دسترسی ندارید و فقط به یک دسته خاص از آنها دسترسی دارید
و در نهایت بگویم که شما میتوانید ا ز کلاسی را که دو اینترفیس را به ارث برده، فقط یک interface (یک دسته از توابع) از آن کلاس را new کنید و بنابراین بقیع توابع اضافی در آبجکت شما وجود ندارد

بهتره به کدی که ضمیمه کردم نگاه کنید تا از شر این توضیحات خلاص شوید
یک روش نگاه کردن به اینترفیس (که کامل نیست و دلیل استفاده ازش نیست) همانطوری که گفتید :"دسته بندی توابع یک کلاس".
در ثانی مفهوم ارث بری در این مورد معنی ندارد، همانطوری که قبلا هم گفتم ، یکی از اینترفیس ارث نمیبره، بلکه اظهار میکنید که کدتان چه اینترفیسی را پشتیبانی میکند،
مفهوم ارث بری یعنی اینکه یک کلاس خصوصیات و قابلیتهایه یک کلاس دیگر را به شکل اتوماتیک دربردارد و شاید یکمقداری قابلیتها و خصوصیتهایه دیگر را اضافه میکند.

این قسمت اشتباه است : "اگه شما از این بعضی توابع دسته بندی شده در کلاس دیگری ارث ببرید آنوقت شما فقط به همه توابع آن کلاس دسترسی ندارید و فقط به یک دسته خاص از آنها دسترسی دارید"
دسترسی نداشتن به توابعی که در اینترفیس نیست روش اشتباه نگاه کردن به این موضوع است. روش درست دیدن این موضوع این که شما با کلاس فقط با طریق اینترفیس قابلیت برقرای ارتباط دارید.

"فقط یک interface (یک دسته از توابع) از آن کلاس را new کنید و بنابراین بقیع توابع اضافی در آبجکت شما وجود ندارد" درست نیست، برایه مثال ،مثالتان را آپدیت کردم

miladr
سه شنبه 04 تیر 1387, 20:27 عصر
شاید این مثال علی پروینی به دردت بخوره!
یه موقع میخوای بگی برام یه ماشین بسازید که اینطوری دنده عوض کنه به این شیوه گاز بده و اینطوری فرمونش بچرخه.
یه موقع میگی اقا من نمیدونم یه چیز میخوام که گاز و فرمون و دنده داشته بشه.
در اولی در واقع شما داری یک کلاس رو تعریف می کنی و در دومی یه اینترفیس.
فکر می کنم بهترین ترجمه هم واسه این کلمه واسط باشه مثل user interface که میشه واسط کاربر.
همه برنامه های تحت ویندوز user interface ویندوز رو پیاده سازی می کنن اما یکی مثل برنامه من و یکی مثل فتو شاپ.
اگر اشتباه می کنم گردن علی پروین.دوستانم ببخشید.