PDA

View Full Version : Interface & Delegate



Future
یک شنبه 27 خرداد 1386, 04:44 صبح
سلام دستان، من در این سایت تاپیکهای زیادی در مورد delegate خواندم و تقریبا همه آنها برای کنترل یک event و یا تعریف event بکار می رفت.ولی در این سایت http://www.csharp-station.com
خوندم که میگه interfaceبرای تعریف event بکار می ره.
راستش من یکم گیج شدم و از اساتید می خواستم یکم بیشتر در مورد این دو مقوله توضیح بدهند و اضلا کی باید از آنها استفاده کرد.
با تشکر

aidinwashere
یک شنبه 27 خرداد 1386, 05:10 صبح
میتونین بجاش در مورد Function Pointer ها مطلب بخونین چون معادل Function Pointer ها در #C میشه Delegate. البته با کمی تفاوت چون در مورد ++C مطلب بیشتر هست تا #C.

reza_rad
یک شنبه 27 خرداد 1386, 07:23 صبح
Delegate در واقع رفرنس به یک متد هست. که می تونه برای تعریف ایونت ها ازش استفاده بشه چون یه متد رو آدرس دهی می کنه.
اما اینترفیس اصلا بحثش جداست. اینترفیس یک قرارداد هست. که توسط کلاسهایی که اون رو پیاده سازی می کنند اعمال میشه. مثلا شما چند تا کلاس داری که توشون قراره کارهای insert,update,delete , ... داده ها انجام بشه. یه اینترفیس می سازی و تعریف این متد ها رو توش میذاری. حالا تمام کلاسهایی که با این قرارداد کار می کنند(یا به عبارتی از این اینترفیس ارث بری می کنند) باید این متد ها رو پیاده سازی کنند.

Delegate:
http://msdn2.microsoft.com/en-us/library/900fyy8e(VS.71).aspx
http://www.codeproject.com/useritems/Delegates_in_C_.asp

Interface:
http://msdn2.microsoft.com/en-us/library/87d83y5b(VS.71).aspx
http://www.codeproject.com/csharp/interfaceconstruct.asp

sinpin
یک شنبه 27 خرداد 1386, 11:42 صبح
سلام دستان، من در این سایت تاپیکهای زیادی در مورد delegate خواندم و تقریبا همه آنها برای کنترل یک event و یا تعریف event بکار می رفت.ولی در این سایت http://www.csharp-station.com
خوندم که میگه interfaceبرای تعریف event بکار می ره.
راستش من یکم گیج شدم و از اساتید می خواستم یکم بیشتر در مورد این دو مقوله توضیح بدهند و اضلا کی باید از آنها استفاده کرد.
با تشکر

من تعریف دقیق این دو اصطلاح رو اونجوری که فهمیدم بگم :

اینترفیس یک قرارداده بین سازنده کلاس و مصرف کننده کلاس و توی pattern ها به شدت از اون استفاده میشه (که البته میشه یک ایونت رو هم با یه اینترفیس پیاده سازی کرد)

و دیلیگیت از نظر تعریفی یک کلاس است که آبجکتهای ساخته شده از اون میتونن متدهای یک کلاس و یا آبجکت دیگه رو call کنن

reza_rad
یک شنبه 27 خرداد 1386, 14:16 عصر
که البته میشه یک ایونت رو هم با یه اینترفیس پیاده سازی کرد
توی اینترفیس پیاده سازی نداریم بلکه فقط تعریف متد ها و ... پیاده سازی در کلاس هایی هست که این اینترفیس رو Implement می کنند.

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


A delegate declaration defines a reference type that can be used to encapsulate a method with a specific signature.
A delegate instance encapsulates a static or an instance method.
Delegates are roughly similar to function pointers in C++;
however, delegates are type-safe and secure.

once4ever
یک شنبه 27 خرداد 1386, 17:28 عصر
یک مثال کاربردی از کاری که Interface انجام میده بنویسید (تواناییش و اینکه چرا باید از اون استفاده کرد)
---
Delegate بخاطر اینکه تنها object نگهدارنده و اجرا کننده یک تابع هست، بجز کنترل event ها میشه در خیلی موارد ازش استفاده کرد. حتی در ارتباط بین دو کلاس میتونه کاربرد جالبی داشته باشه.

reza_rad
دوشنبه 28 خرداد 1386, 08:43 صبح
یک مثال کاربردی از کاری که Interface انجام میده بنویسید (تواناییش و اینکه چرا باید از اون استفاده کرد)

من که مثال زدم!
اگه نمونه کد هم می خواهید به لینک دومی که توی قسمت اینترفیس دادم توجه کنید:
این یک اینترقیس هست برای استفاده در کلاسهایی که کار Input رو انجام می دهند:


//The interface IInput is responsible handling string information.
public interface IInput
{
// Returns a string value from a service
string NotifyOutput();
}

این یک string رو به شما برمی گردونه همونطوری که می بینید پیاده سازی نداره و فقط تعریف داره.

حالا اینها کلاسهایی هستند که از این قرارداد(اینترفیس) استفاده می کنند:


// XMLInput reads some elements from an xml file.
// XMLInput is a subtype of the interface IInput.
public class XMLInput : IInput
{
// An empty constructor
public XMLInput() {}

// Implementation of interface
public string NotifyOutput()
{
return ReadXML();
}

// Simple read of an XML file
public string ReadXML()
{
string str = "";
try {
XmlDocument doc = new XmlDocument();
string xmlFile = System.Windows.Forms.Application.StartupPath +
"\\input.xml";
if (System.IO.File.Exists(xmlFile)){
doc.Load(@xmlFile);
XmlNodeList node1 = doc.GetElementsByTagName("node2");
foreach(XmlNode node2 in node1){
str += node2.ChildNodes[0].FirstChild.Value;
}
}
else {
Console.WriteLine("Missing the input.xml from" +
" application directory.");
}
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
return str;
}
}




// INIInput reads some elements from a simple ini text file.
// INIInput is a subtype of the interface IInput.
public class INIInput : IInput
{
// An empty constructor
public INIInput() {}

// Implementation of interface
public string NotifyOutput()
{
return ReadIni();
}

private string ReadIni()
{
string str = "";
string iniFile = System.Windows.Forms.Application.StartupPath +
"\\input.ini";
try {
if (System.IO.File.Exists(iniFile)){
using (StreamReader sr = new StreamReader(iniFile)) {
String line;
while ((line = sr.ReadLine()) != null) {
str += line;
}
}
}
else {
Console.WriteLine("Missing the input.ini " +
"from application directory.");
}
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
return str;
}
}




// BinInput reads a string from a string object in a binary file.
// BinInput is a subtype of the interface IInput.
public class BinInput : IInput
{
public BinInput() { }

// Implementation of interface
public string NotifyOutput()
{
return ReadBin();
}

public string ReadBin()
{
AStringClass SomeStringClass = null;
string binFile = System.Windows.Forms.Application.StartupPath +
"\\input.bin";
try {
if (File.Exists(binFile)){
IFormatter formatter = new
System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter();
Stream stream = new FileStream(binFile, FileMode.Open,
FileAccess.Read, FileShare.Read);
SomeStringClass = (AStringClass) formatter.Deserialize(stream);
stream.Close();
}
else {
Console.WriteLine("Missing the input.bin" +
" from application directory.");
}
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
return SomeStringClass.SomeString;
}
}

// We need this class to cast the serialized objects from the stream,
// when we read the input.bin file. Is also used to
// create the binary file.
// The create of the binary file is not used in this sample instead the
// input.bin file is coming with the source code.
[Serializable]
public class AStringClass
{
public string SomeString;

public AStringClass()
{
this.SomeString = "Text from a bin file";
string binFile = System.Windows.Forms.Application.StartupPath +
"\\input.bin";
SaveToBinaryFile(binFile);
}

public void SaveToBinaryFile(string binFile){
try {
IFormatter formatter = new
System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter();
Stream stream = new FileStream(binFile, FileMode.OpenOrCreate,
FileAccess.Write, FileShare.None);
formatter.Serialize(stream, this);
stream.Close();
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
}
}


این 3 کلاس هر کدوم یک نوعی از ورودی رو می گیرند(xml-ini-bin) و هر سه تاشون استرینگ NotifyOutput رو به نوعی مقدار دهی می کنند.

متد ها و پراپرتی هایی که توسط اینترفیس تعریف می شن. باید توسط کلاسهایی که توی اون قرارداد هستند حتما پیاده سازی بشن.
توی مثال بالا نیاز بود که سه کلاس BinInput و INIInput و XMLInput هر سه شون پراپرتی ای داشته باشن که نتیجه خوندن رو توی اون نشون بدن. پس ما یک اینترفیس به نام IInput ایجاد کردیم و یه پراپرتی NotifyOutput توش تعریف کردیم و گفتیم که همه ی این کلاسها باید اون رو ایمپلیمنت کنند(به اصطلاح باید این قرارداد رو اجرا کنند).

یک مثال خوب هم توی کتاب C# omid_ahmadi عزیز هست می تونید مطالعه کنید.

اَرژنگ
دوشنبه 28 خرداد 1386, 13:05 عصر
http://www.csharp-station.com
خوندم که میگه interfaceبرای تعریف event بکار می ره.
راستش من یکم گیج شدم
با تشکر

کجا همچین چیزی را گفته؟ اگر میتوانید اون قسمت را کپی و پیست کنید.


یک مثال کاربردی از کاری که Interface انجام میده بنویسید (تواناییش و اینکه چرا باید از اون استفاده کرد)
---
Delegate بخاطر اینکه تنها object نگهدارنده و اجرا کننده یک تابع هست، بجز کنترل event ها میشه در خیلی موارد ازش استفاده کرد. حتی در ارتباط بین دو کلاس میتونه کاربرد جالبی داشته باشه.
چرا باید استفاده کرد نداره، خصوصیتی داره که به کار میاد و مشکلاتی را حل میکند (هر چی که یک مشکلاتی را حل میکند مشکلات دیگری بوجود میاره، استفاده‌اش هم به این بستگی دارد که از مشکلاتی که را حل مینکد از مشکلاتی که بوجود میاره بیشتر باشد).

در مورد Delegate بین دو کلاس، ساده ترین کاربردش در Obesorver Pettern با استفاده از ایجاد Call Back ها هستش که هر کلاس کلاینتی خودش را برایه دریافت Event هایه بخصوصی رجیستر میکند.

ARA
سه شنبه 29 خرداد 1386, 09:44 صبح
بگذارین یک تعریف از delegate رو هم من بگم

از delegate به عنوان یک قطعه کدی که در برنامه تزریق میشود نام میبرند در جاهایی که ما متد های غیر همزمان داریم از این روش برای تزریق کد به بدنه یک ترد استفاده میکنند

اَرژنگ
چهارشنبه 30 خرداد 1386, 06:30 صبح
بگذارین یک تعریف از delegate رو هم من بگم

از delegate به عنوان یک قطعه کدی که در برنامه تزریق میشود نام میبرند در جاهایی که ما متد های غیر همزمان داریم از این روش برای تزریق کد به بدنه یک ترد استفاده میکنند
این تعریف است و یا مثال یکی از جاهایی که استفاده
میشه؟
در مورد تزریق کدی که گفتید یکمقداره بیشتری اطلاعات و یا لینک بدید.

ARA
یک شنبه 03 تیر 1386, 11:24 صبح
ارژنگ عزیز الان یادم نیست کجا خوندم ولی چک میکنم اگه پیداش کردم مطلب رو اینجا میگذارم

یک جوری مفهوم رو نشون میداد

Sorenaa_s
دوشنبه 04 تیر 1386, 19:49 عصر
Delegate در واقع رفرنس به یک متد هست.


این بهترین و واضح ترین تعریف از delegate هست.

hdv212
سه شنبه 05 تیر 1386, 00:10 صبح
یک Delegate، نوع داده ایست که یه متد الگو تعریف میکند و یک نمونه ی ایجاد شده از Delegate، رفرنسی به اون متد خاص است.
برگرفته از کتاب :
Packt Publishing GDI plus Custom Controls with Visual C.Sharp

اَرژنگ
سه شنبه 05 تیر 1386, 20:39 عصر
فکر میکنم یک تعریف Delegate در فارسی یکمقداره بیشتری کار نیاز داره.
تعریف و مثال مایکروسافت http://msdn2.microsoft.com/en-us/library/aa288459(VS.71).aspx


A delegate declaration defines a type that encapsulates a method with a particular set of arguments and return type. For static methods, a delegate object encapsulates the method to be called. For instance methods, a delegate object encapsulates both an instance and a method on the instance. If you have a delegate object and an appropriate set of arguments, you can invoke the delegate with the arguments.

yavari
چهارشنبه 06 تیر 1386, 08:16 صبح
سلام

شاید این بتونه به درک دلگیت کمک کنه ! البته مطلب از خودم نیست !

موفق باشید .

PC2st
چهارشنبه 06 تیر 1386, 20:52 عصر
سلام دستان، من در این سایت تاپیکهای زیادی در مورد delegate خواندم و تقریبا همه آنها برای کنترل یک event و یا تعریف event بکار می رفت.
خوندم که میگه interfaceبرای تعریف event بکار می ره.
interface برای اعلان event، خاصیت یا متد، بکار میره و پیاده سازی اونها، به عهده کلاس واگذار خواهد شد. (interface یک شئ به حساب نمیآد و از کلاس object مشتق نشده و کلاس نیست، تنها یکسری اعلان (تعریف مشخصات) در آن وجود داره)

بنظرم، همانطور که یک خاصیت، مثل سر پوشی برای فیلدهاست، یک event هم مثل یک سرپوش بر روی delegate هاست... مثال زیر رو نگاه کنید، تا حدودی متوجه خواهید شد:



delegate void MyDelegate();
MyDelegate instanceOfDelegate;
event MyDelegate ItIsJustAnEvent
{
add
{
instanceOfDelegate += value;
}
remove
{
instanceOfDelegate -= value;
}
}

add و remove یا باید باهم باشند یا اصلا نباشند.
البته استفاده کردن از آن، فقط به شکل فوق، مناسب نیست مگر اینکه بخواهیم در حین add شدن، کار خاصی رو انجام دهیم در غیر اینصورت، بصورت عادی یعنی بدون add و remove، یک event را تعریف میکنیم.

در اینترفیس، event را بدون add و remove اعلان میکنیم.