اگر غذاهاتون رو توی یخچال نگه میدارید
و لباس هاتون رو توی جالباسی؛
اگه رختخوابی برای خوابیدن دارید
وسقفی بالای سرتونه؛
ثروتمندتر از 75% جمعیت جهان هستید.
قدر داشته هایتان رو بدونید!
اگر غذاهاتون رو توی یخچال نگه میدارید
و لباس هاتون رو توی جالباسی؛
اگه رختخوابی برای خوابیدن دارید
وسقفی بالای سرتونه؛
ثروتمندتر از 75% جمعیت جهان هستید.
قدر داشته هایتان رو بدونید!
delegate (وکیل) چیست؟
شما می توانید فکر کنید یک delegate یک شیئ است که یک یا چند متد را در خود نگهداری می کند. البته درحالت نرمال، اشیائ خاصیت اجرایی ندارند، اما یک delegate با اشیاء معمولی تفاوت دارد. شما می توانید یک delegate را اجرا کنید و هنگامی که شما چنین کاری انجام دهید، آن delegate تمام متد یا متدهایی را که در خود نگهداری می کند را اجرا خواهد کرد.
دراین فصل املاء (syntax) و معناشناسی ساخت و استفاده از delegate را توضیح خواهیم داد. در فصول آینده خواهیم دید که چگونه می توانیم با استفاده از delegate ها کدهای اجرایی را از یک متد به متد دیگر پاس دهیم و اینکه چرا اینکار سودمند است.
PC/UVa IDs: 110101/100
Popularity: A
Success rate: low
Level: 1
الگوریتم زیر را برای تولید دنباله ای از اعداد در نظر بگیرید. از یک عدد صحیح n شروع کنید. اگر n زوج است آنرا بر 2 تقسیم کنید. اگر n فرد است آنرا در 3 ضرب کرده سپس یکی به آن اضافه کنید. این عمل را بر روی مقادیر جدید n تکرار کنید و درصورتی که n برابر با یک شد، این عمل را متوقف کنید. برای مثال دنباله ی زیر برای n=22 تولید شده است.
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
خوب من برنامه مربوط به این چالش برنامه نویسی رو با استفاده از زبان قدرتمند #C نوشته ام و شما می تونید اونو از لینک زیر دانلود کنید. (دانلود در ادامه مطلب)
رابط (interface) می تواند یک رویداد را اعلان کند. مثال زیر چگونگی پیاده سازی رویدادهای رابطی را در یک کلاس نشان می دهد. بطور مقدماتی قواعد و قوانین کار مانند پیاده سازی متد ها یا پراپرتی های رابطی می باشد.
برای پیاده سازی رویدادهای رابطی در یک کلاس
namespace ImplementInterfaceEvents { public interface IDrawingObject { event EventHandler ShapeChanged; } public class MyEventArgs : EventArgs { // class members } public class Shape : IDrawingObject { public event EventHandler ShapeChanged; void ChangeShape() { // Do something here before the event… OnShapeChanged(new MyEventArgs(/*arguments*/)); // or do something here after the event. } protected virtual void OnShapeChanged(MyEventArgs e) { if(ShapeChanged != null) { ShapeChanged(this, e); } } } }
مثال
مثال زیر نشان می دهد که چگونه موقعیتی تقریبا" غیر عادی را که در آن کلاس شما از دو رابط یا بیشتر ارث بری می کند و درعین حال هر رابط دارای یک رویداد با نام مشابه است را مدیریت کنید. در این موقعیت، شما باید حداقل برای یکی از رویدادها، بصورت صریح پیاده سازی رابط را فراهم کنید. وقتی شما برای یک رویداد، پیاده سازی صریح رابط می نویسید، همچنین باید دستیابی کننده های رویداد add و remove را بنویسید. در حالت عادی اینها توسط کامپایلر فراهم می شوند، اما در این مورد کامپایلر نمی تواند آنها را فراهم کند.
مثال ساده زیر راه استاندارد اعلان رویدادها در یک کلاس پایه ای را نشان می دهد، در نتیجه آنها می توانند از طریق کلاس های مشتق شده هم برپا شوند. این الگو بطور گسترده ای در کلاس های Windows Form در کتابخانه کلاس دات نت فریم وورک استفاده شده اند.
وقتی که شما یک کلاس می سازید که توانایی استفاده به عنوان کلاس پایه برای دیگر کلاس ها را دارد، می بایست به این حقیقت توجه داشته باشید که رویدادها نوعی خاص از وکیل ها هستند که فقط می توانند از داخل کلاسی که آنها را اعلان کرده فراخوانی شوند. کلاس های مشتق شده نمی توانند مستقیما" رویداد هایی که در داخل کلاس پایه تعریف شده است را فراخوانی کنند. هرچند در بعضی مواقع شما ممکن است رویدادی را بخواهید که فقط توانایی فراخوانی توسط کلاس پایه را داشته باشد، در اکثر مواقع، شما می بایست کلاس مشتق شده را قادر سازید که رویدادهای کلاس پایه را فراخوانی کند. برای انجام این کار، شما می توانید یک متد فراخواننده محافظت شده (protected) در کلاس پایه بسازید، بگونه ای که رویداد را دربر بگیرد.کلاس های مشتق شده می توانند با صدا زدن یا بازنویسی (override) کردن این متد فراخواننده، رویداد را بصورت غیر مستقیم فراخوانی نمایند.
روال پیش رو چگونگی افزودن رویدادهای منطبق با الگوی استاندارد دات نت فریم وورک به کلاس ها و ساختارهایتان را توضیح میدهد. همه ی رویدادها در کتابخانه کلاس دات نت فریم وورک ، برپایه وکیل EventHandler می باشند که بصورت زیر تعریف شده است :
public delegate void EventHandler(object sender, EventArgs e);
نکته
دات نت فریم وورک 2.0 یک نسخه جنریک (عام) از این وکیل را بصورت (EventHandler (of TEventArgs معرفی می کند. مثال های زیر چگونگی استفاده از هر دو نسخه را نشان می دهند.
هرچند رویدادهای موجود در کلاس هایی که شما تعریف کرده اید می توانند بر پایه ی هر وکیل معتبری باشند، حتی وکیل هایی که مقداری را بازگشت می دهند، اما در کل پیشنهاد می شود که شما رویدادهایتان را برپایه الگوی دات نت فریم وورک قرار دهید. این کار با استفاده از EventHandler ، بصورتی که در مثال زیر توضیح داده شده ، انجام می پذیرد.
شما وقتی که بخواهید کد سفارشی ای بنویسید که هنگام برپا شدن یک رویداد فراخوانی شود، تعهد آن رویداد را که توسط کلاس های دیگر منتشر شده است را امضا می کنید. برای نمونه، ممکن است برای اینکه اپلیکیشن شما کار مفیدی را در مواقعی که کاربر روی دکمه "کلیک" کرد انجام دهد، تعهد رویداد click دکمه را امضا کنید.
امضای تعهد به رویدادها با استفاده از IDE ویژوال استودیو
Event ها یک کلاس یا شیئ را قادر می سازند تا چیزهای مورد علاقه خود را به کلاس ها یا اشیاء دیگر اطلاع دهند. به کلاسی که رویداد را می فرستد ( یا برپا می کند) ناشر می گویند (publisher) و به کلاس هایی که رویداد را دریافت می کنند ( یا استعمال می کنند- handle) ، متعهد ( subscriber ) می گویند.
در یک فرم اپلیکیشن یا وب اپلیکیشن نمونه ی سی شارپ، شما متعهد رویدادهای برپا شده ی کنترل هایی مثل دکمه ها یا لیست باکس ها می شوید. شما می توانید از محیط توسعه یکپارچه (IDE) ویژوال سی شارپ برای مرور رویدادهایی که کنترل ها توانایی برپایی آنها را دارند استفاده کرده و آنهایی را که قصد استعمالشان دارید را انتخاب کنید. IDE بصورت خودکار یک متد خالی (بدون پیاده سازی) استعمال کننده رویداد و همچنین کدهایی برای متعهد شدن به آن رویداد را اضافه می کند.
بررسی رویدادها
رویدادها دارای خصوصیات زیر می باشند: