PDA

View Full Version : گفتگو: پیشوندهای مختلف رویدادها



Hossis
چهارشنبه 06 آبان 1388, 10:59 صبح
اگر ممکنه در باره کلمات کلیدی که قبل از رویداد نوشته می شود ، توضیح بدید
مثال :


Private Overloads Shared Sub temp_()
End Sub

البته Private و Public رو خودم می دونم ولی بقیه رو اگر بشه توضیح بدید خصوصا Overloads و Overridable

alireza_s_84
چهارشنبه 06 آبان 1388, 11:46 صبح
سلام دوست عزیز:
هر متدی در یک کلاس یه پیاده سازی داره که در زبانهای مختلف میتونه پیش فرض اولین یا آخرین پیاده سازی اون متد باشه.
یعنی شما توی یک کلاس متدی رو تعریف میکنید حالا در کلاسهایی که از این کلاس ارث میبرن با توجه به نحوه پیاده سازی کلاس پایه در کلاسی که مشتق شده شما یا اجازه پیاده سازی مجدد متدی که در کلاس پایه تعریف شده رو دارید یا ندارید که با کلمه کلیدی Overloads تعیین میکنید که این پیاده سازی اولین پیاده سازی این متد هست. و کلاسهای مشتق شده میتونن این متد یا ویژگی رو پیاده سازی مجدد کنن.
کلمه کلیدیOverridable هم تعیین میکنه که یک متد یا خصیصه با این متد یا خصیصه میتونه در یک کلاس مشتق شده از این کلاس هم نام باشه.(یعنی اونو بپوشونه و پیاده سازی مجدد بکنه)
موفق باشید

milad.biroonvand
چهارشنبه 06 آبان 1388, 13:30 عصر
private و public حوزه دید هستند ٰ public بصورت عمومی هست و private به صورت خصوصی ٰ یعنی اگه می خوای در تمام یک صفحه بتونی از تبع استفاده بکنی از public باید استفاده بکنی و اگه بخوای در تمام صفحات از تابع استفاده بکنی بعد از اسم تابع shareed بزار . ما چند نوع دیگه هم داریم

friend : که حوزه دیدش از پابلیک کمتره و باز هم مثل private

Hossis
شنبه 09 آبان 1388, 18:58 عصر
با کلمه کلیدی Overloads تعیین میکنید که این پیاده سازی اولین پیاده سازی این متد هست. و کلاسهای مشتق شده میتونن این متد یا ویژگی رو پیاده سازی مجدد کنن.
کلمه کلیدیOverridable هم تعیین میکنه که یک متد یا خصیصه با این متد یا خصیصه میتونه در یک کلاس مشتق شده از این کلاس هم نام باشه.(یعنی اونو بپوشونه و پیاده سازی مجدد بکنه)
موفق باشید
:متعجب::متعجب: ممنون از این توضیح پروفسوری :متعجب::متعجب:
اون چیزی که من فهمیدم اینه که Overridable مثل جاهائی هست که یک تابع یا رویداد چندین صورت داره یعنی می تونه با یک آرگومان و یا دو یا سه آرگومان باشه مثل دستور Dir که کنارشون عبارت 1-3 یا شبیهشون می آد
اون یکی رو نفهمیدم

Hossis
شنبه 09 آبان 1388, 19:00 عصر
اگه میشه یک مثال بزنید
من هر چه می خوام تمرین کنم ، خطا میده

pirmard
شنبه 09 آبان 1388, 22:49 عصر
:متعجب::متعجب: ممنون از این توضیح پروفسوری :متعجب::متعجب:
اون چیزی که من فهمیدم اینه که Overridable مثل جاهائی هست که یک تابع یا رویداد چندین صورت داره یعنی می تونه با یک آرگومان و یا دو یا سه آرگومان باشه مثل دستور Dir که کنارشون عبارت 1-3 یا شبیهشون می آد
اون یکی رو نفهمیدم

اتفاقا من کلی نوشتم ولی ووقتی دیدم جواب داده شده پاکشون کردم !


فرض کنید یک کلاس کلی تعریف کردید به نام کلاس دانش آموز . حالا توی این کلاس یه تابع/متد دارین که تقریبا زیاد کاربردیه و می خاین تعریفش کنین برای اون کلاس .(یعنی برای تمام ساب-کلاسهای کاربرد داره) مثلا تابع معدل دانش آموز.

اما شما انواع زیادی دانش آموز دارید (دانش آموز تجربی - ریاضی - قنی حرفه ای) پس این ساب-کلس ها رو از کلاس اصلی مشتق می گیرین .
حالا توی هر یک از این ساب کلاسهای مشتق شده شما می خاین تابع معدل رو کاستومایز بکنین .یعنی هر کدوم یک فرمول خاص برای معدل گیری دارن .

پس در کل این حالتی شد که ما یه کلاس اصلی داریم با یه تابع که این تابع توی کلاسهای مشتق شده از اون کلاس اصلی رفتار مختلفی می تونه داشته باشد !
برای تعریف اینگونه شما باید در کلاس اصلی تابع، و یا متد مورد نظرتون رو (مثلا تابع معدل گیری رو) به صورت overridable تعریف کنین و در کلاسهای مشتق شده اونو overrideکنین .

مثال
کلاس کلی :


Public student
Public Overridable Function average(p1,p2)
نمرات را بگیر
معدل را حساب کن
return average
End Function





مشتقاتش :

Public Class math_student Inherits student
Public Overrides Function average (p1,p2)
نمرات درس ریاضی و فیزیک را بگیر
معدل را حساب کن با فرمول اختصاصی معدلگیری رشته ی ریاضی
return average
End Function
End Class



برای کلاس های مشتق شده ی مشابه هم میشه چنین کاری کرد مثل همین کلاس دانش آموز ریاضی.
نکنه ی مهم در مورد آورراید کردن اینه که ما چندین متد هم نام در ساب کلاس های ارث برده شده از یک کلاس داریم اما در هر بار فراخوانی متدی که مربوط به آن ساب-کلس باشه فراخوانی میشه .

Hossis
یک شنبه 10 آبان 1388, 11:15 صبح
اورراید رو کاملا گرفتم اگه میشه اورلود رو هم در یک خط معرفی کنید.

pirmard
یک شنبه 10 آبان 1388, 20:27 عصر
اورراید رو کاملا گرفتم اگه میشه اورلود رو هم در یک خط معرفی کنید.

توی اون تاپیک (http://barnamenevis.org/forum/showpost.php?p=838625&postcount=6) در مورد سورت کردن لیست ویو و تری ویو مثالی که زده بودم دقیقا برای تفهیم همین آورلود بود .
تصور کنین یه تابع دارین که انواع ورودی مختلفی رو می خاد قبول کنه و یا پارامتر اختیاری می خاد داشته باشه. این کارو می تونین با استفاده از آورلود کردن پیاده سازی کنین که تابعتون انواع مختلفی رو در ورودی قبول می کنه (چند ریختی یا پولیمرفیزم)

مثال :

یه ساب می خاین بنویسین که روی دو نوع کنترل مختلف کار کنه :

Private Overloads Sub change_color(ByRef TV_control As TreeView, ByVal back_color As Color)
TV_control.BackColor = back_color
End Sub
Private Overloads Sub change_color(ByRef LV_control As ListView, ByVal back_color As Color)
LV_control.BackColor = back_color
End Sub


فراخوانی :

change_color(TreeView1, Color.Aqua)
change_color(ListView1, Color.Aqua)

//

یکی دیگه از استفاده هاش زمانیه که شما بخاین پارامترهای اختیاری تعریف کنین :

Private Overloads Sub change_color(ByRef TV_control As TreeView, ByVal back_color As Color)
TV_control.BackColor = back_color
End Sub
Private Overloads Sub change_color(ByRef TV_control As TreeView, ByVal back_color As Color, ByVal fore_color As Color)
TV_control.BackColor = back_color
TV_control.ForeColor = fore_color
End Sub


فراخوانی :

change_color(TreeView1, Color.Aqua)
change_color(TreeView1, Color.Aqua, Color.Beige)



*- توی وی بی میشه بدون آورلود کردن پارامتر اختیاری تعریف کرد. مزیتش اینه که کدنویسی کمتر میشه . عیبش اینه که شما اگه اون تابع رو بنا به دلیلی دیگه آورلود کرده باشین(مثلا مثل مثال اول که دو نوع کنترا در ورودی داشتین) دیگه نمی تونین از کمله ی کلیدی optional برای تعریف پارامتر اختیاری استفاده کنین
**- اگر تابعی رو می خاین آورلود کنین خروجی توابع باید یکسان باشه(از یک نوع باشه). برخلاف ورودی که می تونین اونو از انواع مختلف تعریف کنین.
***- اینکه چرا گاهی میشه کلمه کلیدی overloads رو از ابتدای تعریف حذف کرد رو فعلا بهش کاری نداریم !
****- عمگرها رو هم میشه آورلود کرد . مثلا عملگر + رو . به این هم فعلا کاری نداریم .