PDA

View Full Version : سوال: مفهوم اینترفیس



Ehsan Programmer
سه شنبه 16 شهریور 1389, 21:03 عصر
سلام
دوستان میشه با یه مثال برای یک مبتدی توضیح بدین اینترفیس چیه؟
ممنون

ایمان مدائنی
سه شنبه 16 شهریور 1389, 22:00 عصر
یک قرار داد در نوع رفتار کلاس است
هر کلاسی intrface را بکار ببر در حقیقت تضمین می کند تمام متدها و خاصیتها و ... که در interface وجود دارد را در خود ایجاد می کند .
برای جمع آوری اطلاعات خاصی از کلاسها می باشد !

Rejnev
سه شنبه 16 شهریور 1389, 22:33 عصر
پیرو مطالب قبل:
وقتی در یک کلاس از یک اینترفیس ارث بری کنید، باید تمامی متدهای اون رو Implement (؟تجهیز) کنید.یعنی نوشتن بدنه متد ها به عهده شماست
مثلا در یک لیست جنریک متدی داریم تحت عنوان Sort که برای مرتب سازی به کار میره.
پارامتر ورودی این متد(یکی از سر بارها)، شی ای است که از اینترفیس IComparer ارث بری میکنه.
ما باید یک کلاس بسازیم و از این اینترفیس ارث بری کنیم و متعاقبل متد Compare اون رو خودمون بنویسیم و بگیم عمل مقایسه باید به چه صورت به کار بره و در نهایت یک نمونه ازون کلاس رو به عنوان پارام ورودی به این متد بدیم:


class Student
{
public string Name { get; set; }
public int Score { get; set; }
}

class MyComparer:IComparer<Student>
{
public int Compare(Student x, Student y)
{
if (x.Score>y.Score)
{
return 1;
}
else if (x.Score<y.Score)
{
return -1;
}
return 0;
}
}

private void someMethod()
{
List<Student> lst = new List<Student>();
lst.Sort(new MyComparer());
}

علیرضا مداح
سه شنبه 16 شهریور 1389, 23:38 عصر
سلام،

از این اینترفیس ارث بری کنیم بیان Inheritance در مورد Interface اشتباه است،
شما یک Interface را "پیاده سازی (Implement)" می کنید،
بررسی یک چنین مفهومی در چند جمله امکان پذیر نیست،
Interface یکی از مفاهیم بنیادین OOP بوده و خصوصا" در پیاده سازی Design Pattern ها، افزایش Testability کد، پیاده سازی مفاهیم SoC یا Separation of Concerns و "بسیاری موارد دیگر" کاربرد وسیعی دارد،
به عبارت ساده، Interface یک قرارداد یا Contract هست که هنگام پیاده سازی، یک کلاس را ملزم به رعایت قوانین موجود در این قرارداد می کند، این قرارداد شامل Signature اعضاء می باشد و جزئیات پیاده سازی را شامل نمی شود، یک Interface ویژگی ها یا قابلیت هایی که باید پیاده سازی شوند را ذکر می کند و پیاده سازی آن ها را به کلاس مربوطه واگذار می کند، اگر با UML و OOP آشنا باشید، از اینترفیش برای بیان روابطی همچون has-a، is-a،can-do... استفاده می شود،
توجه کنید که موارد ذکر شده، تعاریف ساده و نیز خلاصه و نیز ناکاملی از Interface هستند و هر یک نیاز به بحث های بسیار طولاتی و مطالعات بسیار وسیع دارد،/

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

موفق باشید.

میلاد قاضی پور
چهارشنبه 17 شهریور 1389, 02:36 صبح
من یه مثال میزنم امیدوارم اشتباه نباشه .
فرض کنیم انتخابات (وووی) مجلس خبرگان هست و برگه هایی برای رأی دادن اماده شده . برگه ها به صورتی طراحی شدن که به 9 نفر بشه رأی داد . این 9 نفر رو تک تک افراد با میل و سلیقه ی خودشون پر میکنن و به فرد مورد نظرشون رأی میدن (در برگه ها حتما باید نام 9 نفر وارد شده باشه ) . این برگه اصطلاحا اینترفیس نامیده میشه و هر فردی که اون رو پر میکنه به میل و سلیقه ی خودش شماره های 1 تا نه رو با افراد مورد نظرش پر میکنه . در این مثال هر شماره یک تابع به حساب میاد و درج نام افراد در هر شماره پیاده سازی اون تابع .
خب مثالی که کتب برنامه نویسی میزنند اینه . یک کلاس داریم که تعدادی متد توش هست . محتویات این متدها و اینکه توش چه کدهایی نوشته بشه بسته به محلهایی که مورد استفاده قرار میگیره متفاوت هست و ... مشخص نیست . ما این کلاس رو به تمام بانکهای ایران دادیم و ازشون خواستیم متناسب با اطلاعات موجود در هر بانک اون متدها رو پیاده سازی کنند . این کلاس همون اینترفیس ماست . متدهای درون اینترفیس باید حتما پیاده سازی بشن و در هر بانک که ازش استفاده میکنه کدهای مخصوص اون بانک نوشته بشه . بانکها اینطوری ملزم به نوشتن کد و پیاده سازی متدهای اینترفیس هستند.

علیرضا مداح
چهارشنبه 17 شهریور 1389, 09:50 صبح
سلام،

اگر ازش استفاده نکنی چیز مهمی که پروژت رو بخوابونه در Application های در سطح Enterprise استقاده از Interface تقریبا" اجتناب ناپذیر هست،
شما نیاز دارید که Design Pattern های زیادی را پیاده سازی کنید، نیاز دارید کدی داشته باشید که بتوان به طور موٍثر آن را Test کرد، گاهی نیاز پیدا می کنید که یک Plugin Architecture برای پروژه خود طراحی کنید تا بتوان Application را توسط کامپوننت های متفاوت Extend کرد، ممکن است بخواهید از WebService ها استفاده کنید و نیاز به DataContract داشته باشید، ممکن هست که از معماری هایی مثل N-Tier یا DDD یا ... بهره بگیرید یا ... (بسیاری موارد دیگر که در این بحث نمی گنجد)
برای پیاده سازی موثر تمامی موارد فوق در پروژه های Large-Scale نمی توانید استفاده از Interface را نادیده بگیرید، پس اگر از آن استفاده نکنید، چیزهای مهمی را از دست می دهید و گاها" بعضی چیزها را ممکن هست نتوانید به دست بیاورید،

فکر کنم بهترین واژه ای که میشه برای interface در زبان فارسی قائل شد، واژه ی "یاد آور" هست!واژه ای که به کار بردید، برای انتقال مفهوم خوب است، اما Interface بیش از آنکه چیزی را به شما یادآوری کند، آن را به شما "حکم" می کند و گاها" مفهومی فراتر از یادآوری کردن پیاده سازی اعضاء را به همراه دارد،/

Behrouz_Rad
چهارشنبه 17 شهریور 1389, 11:38 صبح
@علیرضا مداح
دوستمون نوشته مبتدی. من که قصد ندارم سناریوهای مختلف و جایگاه Interface در هر کدوم رو مثال بزنم. مسلمه که بعضی وقت ها نیاز به Interface اجتناب ناپذیره. مثلاً برای ارتباط Web Part ها یا برنامه هایی که Plug-in می پذیرن و از MEF استفاده می کنند همه نیاز به Interface دارند اما این نیاز توسط افرادی پیاده سازی شده که اون معماری رو طراحی کردن نه زمانی که من معماری خودم رو بخوام ارائه بدم.

موفق باشید.

saeedalg
چهارشنبه 17 شهریور 1389, 12:33 عصر
@علیرضا مداح
اما این نیاز توسط افرادی پیاده سازی شده که اون معماری رو طراحی کردن نه زمانی که من معماری خودم رو بخوام ارائه بدم.


بابت اینکه گفتید برای مبتدی توضیح میدید با حرفتون موافقم، اما واقعا تو محیط اینترپرایز شما کدی رو نشون بدید که خودتون زدید و از اینترفیس استفاده نکردید من واقعا شگفت زده میشم. البته اگه با C# نباشه با ++C باشه یا ... بازم حتما کلاسایی با متدای virtual Pure دارید.
شاید شما خیلی قویتر از من باشید قصد توهین به هیچ وجه ندارم، به نظر من مبتدی هم باشه با دید درست شروع کنه، وقتی میخوای با یکی صحبت کنی اصلا نفهمه چی میگی یه نیرو رو باید بندازی دور.

Behrouz_Rad
چهارشنبه 17 شهریور 1389, 12:56 عصر
بابت اینکه گفتید برای مبتدی توضیح میدید با حرفتون موافقم، اما واقعا تو محیط اینترپرایز شما کدی رو نشون بدید که خودتون زدید و از اینترفیس استفاده نکردید من واقعا شگفت زده میشم.

بله حتماً، از abstract استفاده کردم.
http://barnamenevis.org/forum/showthread.php?t=228269

saeedalg
چهارشنبه 17 شهریور 1389, 14:03 عصر
بله حتماً، از abstract استفاده کردم.
http://barnamenevis.org/forum/showthread.php?t=228269

1. شاید اگر من به جای اینترپرایز مینوشتم Enterprise فرق میکرد، شما یه App ساده مثال زدید (که خوبم هست). هزاران کد تو همین سایتا هست که هیچی ندارن.[/URL] حتی ارث بری. اصلا [URL="http://mvcmusicstore.codeplex.com/"]MvcMusicStore (http://mvcmusicstore.codeplex.com/) هیچی نداره همشو با EntityFramework هندل کرده رفته زحمتیم به خودش نداده.
2. همون طور که گفتید شما از abstract مثلا تو کلاس OrdersProvider استفاده کردید که بیشتر متدهاشم pure هستن، شما از interface استفاده نکردید ولی از یکی از مفهوم های پشت اون استفاده کردید، اگر سی شارپ یا جاوا اینترفیس رو ارایه نمیدادند مگه ما همین کلاسها رو نداشتیم.
3.من اصلا بحثم اینه که طرف بتونه SOA رو درک کنه، AOP رو درک کنه، نگه چرا یه کلاس (اینترفیسی) که هیچ کاری نمیکنه داریم. همون اول وقتی میگید اینترفیس به کارت نمیاد (پروژت نمیخوابه) هیچ علاقه ای نداره بره دنبالش ببینه چیه، همونطور که آقای مداح گفتن مفهوم اینترفیس خیلی بزرگه شاید شخص برای درک اون بره چند فصل چند کتاب متفاوت رو ورق بزنه تو کدش فکر کنه به این مساله و ... که عالیه حتی هیچی نفهمه.
4. اصلا جاوا یه زبون Specification Oriented هست، هر Vendor هم اومده پیاده سازیه خودش رو داده اگه اینترفیس رو کسی بندازه دور مسلما میگه مثلا با جاوا کاری ندارم و خوب با توجه به این همه سیستم عاملهای متفاوت میگه من اصلا Enterprise تو کارم نیست.

علیرضا مداح
چهارشنبه 17 شهریور 1389, 15:01 عصر
سلام،
@اوج بلند
ببینید آوردن مثال های شهودی برای تشریخ مسائل OOP شیوه ی مرسوم و مناسبی هست، اما در مثال شما مفهوم Interface به درستی بیان نشده است،


اما این نیاز توسط افرادی پیاده سازی شده که اون معماری رو طراحی کردن نه زمانی که من معماری خودم رو بخوام ارائه بدم.یعنی من می توانم اینطور نتیجه بگیرم که شما ممکن هست در یک پروژه ی Enterprise که خودتان معماری آن را طراحی می کنید، از Interface استفاده نکنید؟

ببینید عموما" همه چیز به Scale پروژه بستگی دارد، اینکه شما چقدر می خواهید اجزای پروژه را از هم تفکیک کنید، وابسته به مقیاس پروژه هست، چون هر چه که بیشتر از این مفاهیم بهره بگیرید، مسلما" پیچیدگی کار هم بالا می رود، اما در پروژه هایی با مقیاس Enterprise می بینید که مفاهیم بنیادینی چون Interface در حقیقت Building Block های معماری را تشکیل می دهند،
کتاب C#‎ 3.0 Design Patterns ار انتشارات O'reilly را نگاه کنید که به چه زیبایی به بررسی الگوهای طراحی می پردازد، الگویی را نمی توانید پیدا کنید که در آن از Interface بهره گیری نشده باشد، شاید شما بگویید که من الگوی XXXXX را بدون استفاده از Interface پیاده سازی نمودم، اما قصد من پیاده سازی "صحیح"، به طوری که توسط جامعه ی Developer ها مقبول باشد، هست،

اینکه شما کی و کجا باید از Interface استفاده کنید، نیاز به دانش و تجربه ی کافی دارد، کاربردهای عمیق یک مفهوم را زمانی درک می کنید که با مشکلی روبرو شوید که پس از بررسی به این نتیجه برسید، بهترین راه غلبه بر این مشکل، پیاده سازی آن مفهوم هست،

به هرحال بحث جالبی است که شکل گرفته است و مایلم که ادامه داشته باشد...،/

Behrouz_Rad
چهارشنبه 17 شهریور 1389, 17:24 عصر
@علیرضا مداح
چقدر بحثو میپیچونی :D گفتم که دوستمون گفت مبتدیم. در مورد Design Pattern و Enterpsie بحثی به میون نیومد. معماری جاری من DDD هست و می دونی که خیلی مرسوم شده. من کاملاً حرف هات رو قبول دارم. اما Context من در بحث، وفاداری به متن سوال فرد هست.

موفق باشی.

#aliyari_C
پنج شنبه 18 شهریور 1389, 01:01 صبح
واقعا interface چیست؟ چه کاربردی دارد؟

برا ی پاسخ دادن به این سوالات باید تعریفی از آن داشته باشیم و براساس آن تعریف , ساختار , نوع و....را بیان کنیم.

تعریف:یک رابط چیزی بیش از مجموعه (Abstract Member) نیست.

خوب این قسمت اول تعریف, برداشت که می توان کرد این است .

در مورد abstract موضوعات زیر هست.

از یک کلاس abctract نمی توان عملیات instance (نمونه سازی new,) انجام داد


abstract public class man
{
public man()
{
}
public man(string Name,string LastName)
{
this.Name = Name;
this.LastName=LastName;
}
public string Name { get; set; }
public string LastName { get; set; }
}

حال خط زیر اشتباه است


Man m = new Man();
Man m = new Man("mod", "ali");


حال کلاسمان را تغییر می دهیم



abstract public class Man
{
public Man()
{
}
public Man(string Name,string LastName)
{
this.Name = Name;
this.LastName=LastName;
}
public string Name { get; set; }
public string LastName { get; set; }
}

public class Student : Man
{
public Student() { }
public Student(string Name, string LastName, int Num) : base(Name, LastName)
{
this.Num = Num;
}
public int Num { get; set; }
}

اگر کد پایین را به این شکل بنویسم دیگر اشتباهی نداریم.


Man m1 = new Student();
Man m2= new Student("ali", "mohammed", 1);
<div align="right">این قوانین و اصولی بود که در کلاسهای abstract داشتیم.خوب حال مثالی برای Interface می زنم تا مثال طبق تعریف کمی روشن شود.



public interface Man
{

string Name { get; set; }
string LastName { get; set; }
}


<div align="right">
کد پایین اشتباه است



Man m = new Man();

<div align="right">حال مثال بالا را این گونه پیاده می کنیم.



public interface Man
{

string Name { get; set; }
string LastName { get; set; }
}

public class Student:Man
{
public Student() { }

public Student(string Name, string LastName)
{
this.Name = Name;
this.LastName = LastName;
}

public string Name {get;set;}

public string LastName { get;set;}

}


حال کد پایین درست است



Man m1 = new Student();
Man m2 = new Student("ali","mod");
این از قسمت تعریف اول

دلیل وجود Interface چیست؟

با یک مثال ساده شروع می کینم

ما قرار است یک کارخانه تولید کیس های کامپیوتر ( از نوع هلبی ) بزنیم

خوب شروع به کار می کنیم . می آیم یک اندازه دلخواه (از نوع مدیریت ایرانی) براش تعین می کنیم . بعدش قرار برای خروجی مادربرد و دیگر کارته پشت کیس حفرهایی ایجاد کنیم . از آنجایی که خیلی به روز هستیم ((Last Update=1990 . حفرهایی برای خروجی تعیین می کنیم. و این داستان ادامه دارد.....

حال اگر همچنین کیس هایی قرار باشد بفروش رود

1.کدام مادربرد می تواند روی آن سوار شود؟

2.آیا اگر هم سوار شد آیا حفرهای خروجی با خروجی های مادر برد می خواند؟

3.و......

یک مثال دیگر:

جواب سوال این را می توان در جواب این سوال یافت

هدف از ایجاد سازمان هایی مانند ANSI و W3C و....چیست؟

خوب اینها سازمانهای استاندارد سازی هستند که یک سری استاندارها را بیان می کنند. مثلا W3C قوانین مربوط به XML و HTML را بیان می کند . ANSI قوانینی مانند دستورا ت SQL را بیان می کند. حا ل فرض کنید همچین سازمانهایی نبودند.

آن گاه SQL Server دستورات SQL خودش را داشت و oracle هم دستورات SQL خودش را.

خوب به همین می گویند یک بام و دو هوا . آن گاه مرجعی کامل برای SQL می شد چند مرجع! این وسط بدبخط می شد یک نفر , برنامه نویس

حال فرض کن دانشمندهای ایرانی (ازون دانشمندا) می خواهن نر م افزاری مانند SQL Server درست کنند. امدیم هم بهتر از SQL server درآمد. بعد اونها در حرفشان می گویند برو بابا ANSI آمریکایی........!

فکر می کنی چی میشه! درسته, کسی محل نرم افزا هم نمیزاره .

به کار گیری یک Interface؟
لطفا یک نگاه بیندازید:http://barnamenevis.org/forum/showpost.php?p=475003


تعریفی دیگر: یک Interface کاری به پیاده سازی متدها ,خصوصتها و فیلدهای خود در کلاس مورد نظر ندارد بلکه مقصود و هدف آنها را بیان می کند .

برای در ک مفهوم به یک مثال ساده می پردازیم!

طبق همیشه ظهر شده و بچه هم حوصله اش سر رفته و به پدرش می گوید که می خواهد برود بیرون بازی کند . پدر: اگر تکلیف فارسی چی بود ..... اها تصمیم کبری را نوشتی آنگاه می توانی بروی بیرون بازی کنی . حال بچه با دست خط هچلفتش 3 سوت درس رو می نوسه و پدر گرامی از ترس زنش چون قول داده بود و نمی خواست زیر قولش بزند به بچه اجازه رفتن می ده(این پدر شماره 1)

حال فرزندی دیگر

پدر: اگر تکلیف فارسی چی بود ..... اها تصمیم کبری را نوشتی و دست خط ات خوب بود آن گاه بیرون می روی و گرنه همان میرزا بنویس می شوی..(این پدر شماره 2)

حال فرزندی دیگر:

پدر: اگر تکلیف فارسی چی بود ..... اها تصمیم کبری را نوشتی و سوال من در مورد درس تصمیم کبرای جواب درست دادی آن گاه می توانی بروی(این پدر شماره3)

حال برای تمامی پدران ما یک متد تعریف می کنیم , که این متد یک رشته( همتن تکلیف بچه) است را می گیرد و مقدار bool (اگر بچه تکلیفش کامل بود که برود بازی کند =true و اگر ناقصبود=false بر می گرداند( است .


public interface IFather
{

bool HomeWork(string str);

}

<div align="right">حال پیاده سازی برای 3 پدر , طبق اضهاراتشان



public class Father1:IFather
{

public bool HomeWork(string str)
{
if (str.Length > 100)
return true;
return false;
}
}
public class Father2 : IFather
{

public bool HomeWork(string str)
{



//میرزابنویس
if (str.Length > 300 /* && Treu فرضمیکنمینرمافزاردستخطخوا نخوبداریمواگردستخطخوببودم قدار*/ )

return true;
str = null;//چونبابامیخوابچشقشنگیادبگی رهتکلیفشوپارهمیکنهمیگه :میرزابنویس
return false;
}
}
public class Father3 : IFather
{


public bool HomeWork(string str)
{

//میرزابنویس
if (str.Length > 110 /* && Treu بهفرضیکسوالپرسدهمیشودواگر درستبودمقدار*/ )

return true;
return false;
}
}

(به خاطر اینکه مسائل زیاد پیچیده و ساده شوند از خصوصیت ها استفاده نکرده ام)



http://up.iranblog.com/Files7/dffa5d753f174f8a83ba.png
در اینجا است که تعریف واضح تر می شود.

همانطور که مشاهده کردید تمامی 3 پدر گرامی یک کار مشخص ( گرفتن تکلیف و صادر کردن اجازه) با رفتار های متفاوت(همان پاده سازی , یک پدر سوال می پرسید ودیگری دست خط را چک می کرد) از حود بروز می داند

البته برای پدران بی خیال همچین متدی باید نوشت



public class Father : IFather
{

public bool HomeWork(string str)
{
return true;
}

}

امیدوارم کامل و جامع بوده باشد.

موفق و تندرست باشید.
__________________________________________________ _________________________
چون به دریاه می توانی راه یافت.................سوی یک قطره چرا باید شتافت

reza6384
یک شنبه 21 شهریور 1389, 17:25 عصر
با تشکر از پاسخ های شما دوستان.

یک سوال دارم.

اگر در یک کلاس بخواهید اینترفیس Microsoft.Office.Interop.Excel._Worksheet رو پیاده سازی کنید متدها و توابعی که باید پیاده سازی کنید، یکیشون به اسم Pictures هست :



Imports Microsoft.Office.Interop.Excel

Public Class Class1
Implements Worksheet
.
.
.

Public Function Pictures(Optional ByVal Index As Object = Nothing) As Object Implements Microsoft.Office.Interop.Excel._Worksheet.Pictures

End Function

End Class


و مثلاً در یک Dll با نام Aspose.Cells که برای کار کردن با فایل های اکسل هست تابع Pictures تعریف شده که یک Collection بر می گردونه و میشه باهاش کار کرد و به عکس های یک فایل اکسل دسترسی پیدا کرد.

اما در Microsoft.Office.Interop.Excel.Worksheet تابع Pictures وجود نداره! آیا ممکنه که مایکروسافت خودش این اینترفیس رو تعریف کرده باشه اما تابعش رو پیاده سازی نکرده باشه؟! احتمالاً اینجوری نیست ( یعنی مشکل از صورت مساله است )
در لینک زیر :
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._worksheet.pictures (office.11).aspx
نوشته شده که :

This method supports the .NET Framework infrastructure and is not intended to be used directly from your code.

و من اینجا یکم دچار ابهام شدم. ممنون میشم اگر توضیح بدین.

reza6384
دوشنبه 22 شهریور 1389, 15:10 عصر
کسی نیست که جواب سوال من رو بده؟ فکر کنم یک مشکل این بخش برنامه نویسی با دات نت اینه که از بس شلوغه و هنوز هم پر از تاپیک های تکراری کسی که دنبال جواب سوالش میگرده مجبوره یکی دوروز یکبار بیاد یک پست بزنه تا تاپیک توی صفحه اول نمایش داده بشه و یک نفر مرحمت کنه و جوابش رو بده.