چگونه میتوان یکevent را در سازنده کلاس طراحی کرد که وقتی یک شی ایجاد شد در message box نمایش دهد که ان ایجاد شده است.
Printable View
چگونه میتوان یکevent را در سازنده کلاس طراحی کرد که وقتی یک شی ایجاد شد در message box نمایش دهد که ان ایجاد شده است.
ببخشید شاید من بد متوجه شدم ولی این چه ربطی به event داره از خود سازنده استفاده کن
شما نمیتونید یک ایونت هندلر رو به آبجکتی که هنوز ساخته نشده نسبت بدید. دو راهی که فی البداهه به ذهن میرسه :
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!");
}
خوب هر کدی که تو سازنده بنویسی موقع ایجاد یک نمونه از آن کلاس اون کدها اجرا خواهند شد (در اینجا نشون دادن یک Mbox)نقل قول:
چگونه میتوان یکevent را در سازنده کلاس طراحی کرد که وقتی یک شی ایجاد شد در message box نمایش دهد که ان ایجاد شده است.
درسته، اما :
1- این تعریف یک رویداد نیست
2- فکر میکنم شما سازنده و مصرف کننده ی کلاس رو یکنفر فرض کردید.
حالا فرض کنید من قراره از اسمبلی شما استفاده کنم و وقتی یکی از کلاسهای شما رو instantiate کردم باید یک رویداد تحریک بشه؛ خب من به سورس کلاس شما دسترسی ندارم و نمیتونم کد دلخواه خودم رو - در زمان تحریک - به کانستراکتر اون تزریق کنم.
دقیقا اینطور بود lolنقل قول:
ضمن اینکه فکر میکنم شما سازنده و مصرف کننده ی کلاس رو یکنفر فرض کردید.
مرسی
sinpin:
ممنون از راهنمایی شما.
راه اول با یک مثال توضیح بدین.
راه دوم شما یه مشکل داره:اینکه اگر بجای لود فرم از کلیک یک دکمه استفاده کنیم برنامه اجرا میشه اما از نظر منطقی ایراد داره:
اگه بار اول دکمه رو کلیک کنید پیام رو نشون میده اگه بار دوم دکمه رو کلیک کنید پیام رو 2بار نشون میده الی ...
درصورتی که ما می خواهیم با هر بار کلیک شدن فقط یکبار پیام بده.
یک سوالی اینجا پیش میاد که event هم مثل شی طول حیات داره و از بین میره؟
در ضمن این دو خط را ملاحظه نمایید:
MyClass.Created += new MyClass.CreationHandler(MyClass_Created);
MyClass mc = new MyClass();
در خط 1 شما event رو برای خود کلاس تعریف کردید نه برای شی mc
در صورتی که می خواستیم هنگامی که یک شی ساخته میشه یک event
آزاد بشه.اصلا روی شی mc این event تعریف نشده است.(چون استاتیک هست)
یک کمی اگر بخواهیم همین برنامه شما رو پیچیده کنید خودمون یک کلاس event بسازیم و از آن در برنامه استفاده کنیم.
bermooda:از شما نیز ممنونم.
gdevnb:توضیحات کامل دادم تا این دفعه شما هم متوجه بشید.
در ضمن فایل رو هم ضمیمه کردم.
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);
}
}