PDA

View Full Version : سوال: override توابع کنترل ها



ahmad-hagh
چهارشنبه 21 مهر 1389, 19:39 عصر
با سلام
خواستم بدونم میشه توابع نوشته شده و استاندارد یک کنترل (کامپوننت) رو override کنم
مثلا وقتی یه کلاس تعریف میکنم به راحتی میشه تابع ToStringش رو override کرد اما تا حالا نتونستم تابع toString یه text Box رو override کنم

تقریبا میشه گفت میخوام سورس ها رو تغییر بدم. درسته برنامه open source نیست ولی یه امید هایی دارم
اگه کسی مطمئنه نمیشه بگه تا یه راه دیگه پیدا کنم

r00tkit
چهارشنبه 21 مهر 1389, 20:18 عصر
سلام

من برای button رو نوشتم شد (فرقی نداره )

یه کلاس درست کن از textbox ارسش ببر بعد override کن بعد حالشو ببر

اینم یه مثال



public class MyTextBox :TextBox
{
override String ToString()
{
// do what you want here.

}
}

ahmad-hagh
شنبه 24 مهر 1389, 13:52 عصر
ممنون
ولی منظور من چیزی دیگست (اینوکه میدونستم)
من میخوام تابع textBox1.Text.ToString() رو اوور لود کنم نه toString خود کلاس (کنترل) رو
میتونی کمکم کنی؟؟

r00tkit
شنبه 24 مهر 1389, 14:33 عصر
سلام

دوست من

textBox1.Text.ToString()

با

"hello".ToString()


فرقی نداره چون از طرق
getter متعلق به text یه رشته برگشته و دیگه ان ربطی به کلاس textbox نداره شما می تونی پراپرتی text رو override کنی

و بگی به جای اینکه string برگردونه یه mysrting رو برگردنه

اگه با reflector به ساختار text نگاه کنی موضوع شفاف تر می شه

چیزی که از text برمی گرده یه متغییر محلی هستش به نام string (http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:969db8053d3322ac/System.String) str = null;

ahmad-hagh
شنبه 24 مهر 1389, 18:59 عصر
ببین این کلاس منه


class txtBox:System.Windows.Forms.TextBox
{
public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}
public override string ToString()
{
return " ACU281. ";
//return base.ToString();
}
}

بعد تو رویداد کلیک دکمم مینویسم

label1.Text=tb.Text.ToString()
tb یه شئ از کلاسمه که با control.add به فرمم اضافه شده
الان لیبل من مقدارش "ACU281." نمیشه
واسه این که بشه باید بنویسم

label1.Text=tb.ToString()
ذهنیت من اینه که هر ساختار و ... یه متد ToString داره
نکنه این ذهنیتی که دارم اشتباهه؟؟

mohsen_csharp
شنبه 24 مهر 1389, 19:28 عصر
ببین این کلاس منه


class txtBox:System.Windows.Forms.TextBox




{

public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}
public override string ToString()
{
return " ACU281. ";
//return base.ToString();
}

}


بعد تو رویداد کلیک دکمم مینویسم

label1.Text=tb.Text.ToString()
tb یه شئ از کلاسمه که با control.add به فرمم اضافه شده
الان لیبل من مقدارش "ACU281." نمیشه
واسه این که بشه باید بنویسم

label1.Text=tb.ToString()
ذهنیت من اینه که هر ساختار و ... یه متد ToString داره
نکنه این ذهنیتی که دارم اشتباهه؟؟

دوست عزیز شما با کدی که نوشتی متد toString رو override کردی
نتیجه اش هم همونه که آخرش نوشتی
شما که متد toString کلاس string رو override نکردی که بخوای بنویسی tb.Text.ToString()
البته امکان پذیر نیست که متد toString رو برای کلاس string ، override کنی چون کلاس string به صورت selead تعریف شده و نمی شه ازش ارث بری کرد

Javad_Darvish_Amiry
شنبه 24 مهر 1389, 23:30 عصر
سلام دوست عزیز!
اول ببینیم override کردن یعنی چی؟ (البته میدونم بلدید، سوء تفاهم نشه، میخوام یه منطقی رو در پیش بگیرم تا به یه نتیجه ای برسیم) یعنی اینکه من یه کلاس والد دارم، یه متد داره مثلا به اسم ToString، حالا یه کلاس دیگه دارم، که از کلاس اولم ارث برده، طبیعتا همه اعضا(متد ها، فیلدهای غیر خصوصی، خصوصیات) رو هم ازش ارث برده و حالا داره، اما همون مثالی که زدیم، یعنی متد ToString توی کلاس جدید رفتارش با اونچه که مد نظر من هستش فرق داره، بنابراین میام توی کلاس جدیدم این متد رو بازنویسی یا همون override میکنم و ازش میخوام اونطور که من میخوام رفتار کنه، نه اونطوریکه والدش بهش منتقل کرده؛ پس override کردن یه رفتار وقتی معنی داره که توارثی وجود داشته باشه؛
این که میفرمایید که وقتی کلاس جدیدی تعریف میکنید، میتونید متد ToString اش رو بازنویسی کنید، هم موید این مطلبه، چون این متد متعلق به کلاس Object هستش، که همه کلاس های دیگه مستقیم یا غیر مستقیم ازش ارث میبرن، پس همه کلاس ها هم میتونن اونو بازنویسی کنن؛
خوب حالا شما وقتی از یه کلاس مثلا به اسم TextBox ارث نمیبری، چطور میخوای متدهاشو بازنویسی کنی؟ چون شما اصلا متدهاشو نداری، مال شما نیست، شما فقط میتونی متدهاشو رو فراخونی کنی، یا اینکه اگه بخوام خیلی شیئ گرایانه بگم میشه: شما فقط میتونی از این شیئ (مثلا نمونه TextBox ای که ساختی و داری ازش استفاده میکنی) درخواست کنی که فلان رفتار خاص رو (مثلا رفتار ToString) از خودش به نمایش بذاره. فکر میکنم در مورد شیئ گرایی مخصوصا تعریف شیئ، ایجاد و نمونه سازی از شیئ، و استفاده از شیئ، بیشتر مطالعه کنی، این ابهام برات برطرف میشه.
اما در مورد تغییر سورس ها، خدمتتون عرض کنم که کد دات نت بسته نیست و شما قسمت های خیلی زیادی از دات نت رو میتونی تو سایت میکروسافت پیدا کنی، البته سورس منتشر شده آموزشیه و با نمونه تجاریش فرق هایی هم داره، اما هم اینکه بابت آموزش واقعا عالیه، و هم اینکه تو هر بسته ای که منتشر شده، معمولا تفاوت های نسخه آموزشی که شما داری دانلود میکنی و نسخه تجاری ذکر شده و اگر هم نباشه تو وبلاگ اعضای تیم دات نت میتونی مقاله هایی رو که راجع به تفاوت های مورد نظر هست، پیدا کنی.
از طرف دیگه برای بخش های منتشر نشده (چون میکروسافت داره به تدریج اینکارو انجام میده) هم میتونی از Reflector استفاده کنی که عین کد رو از اسمبلی بهت بر می گردونه (آدرس دانلودش یادم نیست، تو گوگل جستجو کن)، حالا شما میتونی مثلا برای تغییر رفتارهای TextBox خودت یه کلاس تعریف کنی (مثلا MyTextBox) و کد تغییر داده شده ی TextBox رو توش بنویسی، اونجاهایی هم که ثابته که خوب همون رفتارو داره و میتونی از جادوی Copy & Paste استفاده کنی، هم به منظورت میرسی و هم آموزش خیلی خوبیه.
در رابطه با اضافه کردن یه سری رفتارها هم به اشیاء از پیش تعریف شده، بدون تغییر در سورسشون، میتونی از Extension ها استفاده کنی، فکر کنم تو همین فوروم بچرخی چیزایی در مورد اکستنشن ها گیرت میاد؛ اگه چیزی نبود، بگو تا برات توضیح بدم.
امیدوارم مطالب به دردت خورده باشه.
پیروز و پاینده باشی.

r00tkit
یک شنبه 25 مهر 1389, 00:19 صبح
hi
sorry
alt+shift dont work cuz i'm in ubuntu

my friend ROTOR is implementation of CLI it differ from .NET and

when we see ROTOR code actualy we see how CLR and etc are coded it's not same what we see in reflector
reflector show manage code

Javad_Darvish_Amiry
یک شنبه 25 مهر 1389, 00:39 صبح
alt+shift dont work cuz i'm in ubuntu

سلام دوست عزیز، خوب چرا فارسی رو فعال نمیکنی تو اوبونتو؟ از تو تنظیمات داره، alt+shift ش هم دقیقا کار میکنه، فقط الان دقیق یادم نیست از کدوم قسمت، برو تو فوروم فارسی اوبونتو، اونجا راهنماییش هست:
http://ubuntu.ir (http://ubuntu.ir/)
والله من دقیقا نگرفتم چی گفتی؟؟؟
حداقل فینگلیش بنویس.

ahmad-hagh
یک شنبه 25 مهر 1389, 08:42 صبح
ممنونم آق جواد


خوب حالا شما وقتی از یه کلاس مثلا به اسم TextBox ارث نمیبری
یه نگاه به کدم بنداز میفهمی که من از تکست باکس ارث بردم . ببین
class txtBox:System.Windows.Forms.TextBox
خلاصه ممنون از همتون
دیشب تقریبا به هدفی که میخواستم رسیدم
منظور geek رو هم فهمیدم.یه سرچ بزن متوجه میشی
احساس میکنم Extension ها چیزای جالبی باشن.باس برم سراغش (ممنون از راهنماییت)
بدرووووود

r00tkit
یک شنبه 25 مهر 1389, 08:55 صبح
سلام دوست عزیز، خوب چرا فارسی رو فعال نمیکنی تو اوبونتو؟ از تو تنظیمات داره، alt+shift ش هم دقیقا کار میکنه، فقط الان دقیق یادم نیست از کدوم قسمت، برو تو فوروم فارسی اوبونتو، اونجا راهنماییش هست:
http://ubuntu.ir (http://ubuntu.ir/)
والله من دقیقا نگرفتم چی گفتی؟؟؟
حداقل فینگلیش بنویس.

شما الان داری زکات علمت رو پرداخت کردی نمی دونم این لطف شما رو چی جوری جبران کنم

برادر می گم سورس Rotor فرق داره با سورسی که reflector نشون می ده

نمی دونم چی جوری این هارو به هم ربط دادی

اگه نمی دونی ROTOR چیه: justfuckinggoogleit.com

mohsen_csharp
یک شنبه 25 مهر 1389, 13:59 عصر
حالا شما میتونی مثلا برای تغییر رفتارهای TextBox خودت یه کلاس تعریف کنی (مثلا MyTextBox) و کد تغییر داده شده ی TextBox رو توش بنویسی، اونجاهایی هم که ثابته که خوب همون رفتارو داره و میتونی از جادوی Copy & Paste استفاده کنی، هم به منظورت میرسی و هم آموزش خیلی خوبیه
معمولا نمی شه این کارو کرد یعنی بیایم کل سورس یه تکست باکس رو با رفلکتور بازش کنیم و کپی پیست کنیم تو پروژمون و یه تکست باکس خودمونو بسازیم
چون معمولا کنترل هایی مثل تکست باکس از کلاس هایی در دات نت فریم ورک استفاده می کنند که به صورت اینترنال تعریف شده اند و اگه کد کپی پیست شده رو کامپایل کنی ارور میده !!!

Javad_Darvish_Amiry
یک شنبه 25 مهر 1389, 18:20 عصر
سلام

من برای button رو نوشتم شد (فرقی نداره )

یه کلاس درست کن از textbox ارسش ببر بعد override کن بعد حالشو ببر

اینم یه مثال



public class MyTextBox :TextBox
{
override String ToString()
{
// do what you want here.

}
}



ممنون
ولی منظور من چیزی دیگست (اینوکه میدونستم)
من میخوام تابع textBox1.Text.ToString() رو اوور لود کنم نه toString خود کلاس (کنترل) رو
میتونی کمکم کنی؟؟


ممنونم آق جواد


یه نگاه به کدم بنداز میفهمی که من از تکست باکس ارث بردم . ببین
class txtBox:System.Windows.Forms.TextBox
خلاصه ممنون از همتون
دیشب تقریبا به هدفی که میخواستم رسیدم
منظور geek رو هم فهمیدم.یه سرچ بزن متوجه میشی
احساس میکنم Extension ها چیزای جالبی باشن.باس برم سراغش (ممنون از راهنماییت)
بدرووووود

اول اینکه بنده آق جواد نیستم، البته شما لطف دارین، ولی من کوچیکتر از این حرفهام؛ دوم اینکه خودتون مرور کنید مطالب رو ببینید بالاخره اون آدم بالا خودش اینو میدونست یا چی یا نه یا بالاخره؟؟؟ سوم اینکه چی رو سرچ بزنم متوجه میشم؟؟؟
البته عذرخواهی میکنم که اینقدر صریح گفتم.
پاینده باشید.

Javad_Darvish_Amiry
یک شنبه 25 مهر 1389, 18:48 عصر
برادر می گم سورس Rotor فرق داره با سورسی که reflector نشون می ده
نمی دونم چی جوری این هارو به هم ربط دادی

سلام، نه من نمیدونم ROTOR چیه و تا حالا باهاش برخورد نکردم؛ اما متوجه سوال شما هم که فرمودید چی جوری این ها رو به هم ربط دادم نشدم، چی ها رو به هم ربط دادم؟ اگه منظورت اینه که چی جوری اینا رو به هم ربط میدم (یعنی تفاوت بین دو کد رو)، خوب عرض کردم که ROTOR نمیدونم چیه، اما اگه به اساس کار Reflector نگاه کنیم، متوجه میشیم که با یه درصد بالایی از اطمینان اصل کد منبع رو بهمون بر میگردونه، میگم درصد بالای اطمینان، چون رفلکتور از IL برای برگردوندن کد استفاده میکنه و IL شامل تغییراتی که کامپایلر به کد اعمال کرده هم میشه. که البته این جا هم با attribute هایی که به کد اضافه میشه باز میشه تا یه درصد بالایی حدس زد که کد چی بوده.
در ضمن اینکه کدی که رفلکتور بر میگردونه کاملا قابل اجرا است:::


معمولا نمی شه این کارو کرد یعنی بیایم کل سورس یه تکست باکس رو با رفلکتور بازش کنیم و کپی پیست کنیم تو پروژمون و یه تکست باکس خودمونو بسازیم
چون معمولا کنترل هایی مثل تکست باکس از کلاس هایی در دات نت فریم ورک استفاده می کنند که به صورت اینترنال تعریف شده اند و اگه کد کپی پیست شده رو کامپایل کنی ارور میده !!!

که البته این کار ریزه کاری ها و گاهی هم هوشیاری های خاص خودش رو میخواد، کلاس های اینترنال هم هستن، گاهی هم تشخیص تغیییر اعمال شده سخته و یه متغیر یا یه پراپرتی جا میمونه؛
ولی در هر صورت همون IL هستش که داره کار میکنه.
فقط بابت مثال برای یک رویداد اتفاق زیر می افته:
کد اولیه مثلا می تونه این باشه:



public event EventHandler CurrentChanged;


اما کدی که رفلکتور معمولا تولید می کنه (البته به خاطر کدی که کامپایلر تولید میکنه، و اینجا هم باید با امکانات زبان و تغییراتی که موقع کامپایل روش اعمال میشه آشنایی داشت) چنین چیزی میتونه باشه:



private EventHandler m_CurrentChanged;
public event EventHandler CurrentChanged {
add {
this.m_CurrentChanged= (EventHandler)Delegate.Combine(this.m_CurrentChang ed, value);
}
remove {
this.m_CurrentChanged= (EventHandler)Delegate.Remove(this.m_CurrentChange d, value);
}
}


و چنین تغییراتی معمولا زیاد انجام میشه، مثل پراپرتی های اتوماتیک و حتی خود پراپرتی های سنتی و متد های getter و setter که براشون تولید میشه.
زیاد حرف زدم، ببخشید. پاینده و پیروز باشید.
(راستی اگه ممکنه یه لینک در مورد ROTOR برام بفرست. نظرم رو جلب کرد، باید جالب باشه؛ ممنونم.)

ahmad-hagh
دوشنبه 26 مهر 1389, 13:37 عصر
اول اینکه بنده آق جواد نیستم، البته شما لطف دارین، ولی من کوچیکتر از این حرفهام؛ دوم اینکه خودتون مرور کنید مطالب رو ببینید بالاخره اون آدم بالا خودش اینو میدونست یا چی یا نه یا بالاخره؟؟؟ سوم اینکه چی رو سرچ بزنم متوجه میشم؟؟؟
خوب نمیدونستم چی صدات کنم واسه همین اول یوزرت رو آوردم
قسمت های قبل علامت سوال رو قاط زدم-نمیفهمم چی میگی
و اما سرچ در مورد

when we see ROTOR code actualy we see how CLR and etc are coded it's not same what we see in reflector
reflector show manage code

بود-
گفتم در مورد ROTOR سرچ کنی منظور geek رو میفهمی هرچند با ترجمه همین نقل قول بالایی هم میشه تفاوتش رو فهمید