PDA

View Full Version : ایجاد event در سازنده یک کلاس



soltanc
پنج شنبه 15 فروردین 1387, 19:33 عصر
چگونه میتوان یکevent را در سازنده کلاس طراحی کرد که وقتی یک شی ایجاد شد در message box نمایش دهد که ان ایجاد شده است.

gdevnb
پنج شنبه 15 فروردین 1387, 21:44 عصر
ببخشید شاید من بد متوجه شدم ولی این چه ربطی به event داره از خود سازنده استفاده کن

sinpin
پنج شنبه 15 فروردین 1387, 22:16 عصر
چگونه میتوان یکevent را در سازنده کلاس طراحی کرد که وقتی یک شی ایجاد شد در message box نمایش دهد که ان ایجاد شده است.
شما نمیتونید یک ایونت هندلر رو به آبجکتی که هنوز ساخته نشده نسبت بدید. دو راهی که فی البداهه به ذهن میرسه :
1- کلاس کانستراکتری با پارامتر از نوع دیلیگیت داشته باشه. (که اونجا تعیین میشه چه متودی در هنگام ایجاد آبجکت باید اجرا بشه؛ که این دیگه رویداد نمیشه!)
2- کلاسی با یک رویداد استاتیک

راه دوم :

public class MyClass
{
public delegate void CreationHandler(object sender, EventArgs e);
public static event CreationHandler Created;

private void OnCreate()
{
if (Created != null)
Created(this, new EventArgs());
}

public MyClass()
{
OnCreate();
}
}نحوه ی استفاده :

private void Form1_Load(object sender, EventArgs e)
{
MyClass.Created += new MyClass.CreationHandler(MyClass_Created);
MyClass mc = new MyClass();
}

void MyClass_Created(object sender, EventArgs e)
{
MessageBox.Show("salam!");
}
ببخشید شاید من بد متوجه شدم ولی این چه ربطی به event داره از خود سازنده استفاده کن
ایشون میخوان کاربر استفاده کننده از کلاس - بدون نیاز به دسترسی به کانستراکتر کلاس - تعیین کنند که چه عملیاتی پس از ایجاد یک نمونه باید انجام بشه.

Amir Oveisi
پنج شنبه 15 فروردین 1387, 23:35 عصر
چگونه میتوان یکevent را در سازنده کلاس طراحی کرد که وقتی یک شی ایجاد شد در message box نمایش دهد که ان ایجاد شده است.

خوب هر کدی که تو سازنده بنویسی موقع ایجاد یک نمونه از آن کلاس اون کدها اجرا خواهند شد (در اینجا نشون دادن یک Mbox)

sinpin
جمعه 16 فروردین 1387, 00:30 صبح
خوب هر کدی که تو سازنده بنویسی موقع ایجاد یک نمونه از آن کلاس اون کدها اجرا خواهند شد (در اینجا نشون دادن یک Mbox)
درسته، اما :
1- این تعریف یک رویداد نیست
2- فکر میکنم شما سازنده و مصرف کننده ی کلاس رو یکنفر فرض کردید.

حالا فرض کنید من قراره از اسمبلی شما استفاده کنم و وقتی یکی از کلاسهای شما رو instantiate کردم باید یک رویداد تحریک بشه؛ خب من به سورس کلاس شما دسترسی ندارم و نمیتونم کد دلخواه خودم رو - در زمان تحریک - به کانستراکتر اون تزریق کنم.

Amir Oveisi
جمعه 16 فروردین 1387, 00:33 صبح
ضمن اینکه فکر میکنم شما سازنده و مصرف کننده ی کلاس رو یکنفر فرض کردید.

دقیقا اینطور بود lol
مرسی

soltanc
شنبه 17 فروردین 1387, 02:12 صبح
sinpin:
ممنون از راهنمایی شما.
راه اول با یک مثال توضیح بدین.
راه دوم شما یه مشکل داره:اینکه اگر بجای لود فرم از کلیک یک دکمه استفاده کنیم برنامه اجرا میشه اما از نظر منطقی ایراد داره:
اگه بار اول دکمه رو کلیک کنید پیام رو نشون میده اگه بار دوم دکمه رو کلیک کنید پیام رو 2بار نشون میده الی ...
درصورتی که ما می خواهیم با هر بار کلیک شدن فقط یکبار پیام بده.
یک سوالی اینجا پیش میاد که event هم مثل شی طول حیات داره و از بین میره؟
در ضمن این دو خط را ملاحظه نمایید:
MyClass.Created += new MyClass.CreationHandler(MyClass_Created);
MyClass mc = new MyClass();
در خط 1 شما event رو برای خود کلاس تعریف کردید نه برای شی mc
در صورتی که می خواستیم هنگامی که یک شی ساخته میشه یک event
آزاد بشه.اصلا روی شی mc این event تعریف نشده است.(چون استاتیک هست)
یک کمی اگر بخواهیم همین برنامه شما رو پیچیده کنید خودمون یک کلاس event بسازیم و از آن در برنامه استفاده کنیم.
bermooda:از شما نیز ممنونم.
gdevnb:توضیحات کامل دادم تا این دفعه شما هم متوجه بشید.
در ضمن فایل رو هم ضمیمه کردم.

gdevnb
شنبه 17 فروردین 1387, 03:07 صبح
delegate string StrMod(string str);

class c1
{
public c1(StrMod sm)
{
//...
sm("str");
}
}
class c2
{
static string replaceSpaces(string a)
{
return a;
}

public static void Mainx()
{
StrMod strOp = new StrMod(replaceSpaces);
c1 x = new c1(strOp);
}
}