PDA

View Full Version : بازهم شی گرا ورژن N



alireza_tavakol
پنج شنبه 19 مهر 1386, 15:19 عصر
دوستان من دارم دیوانه میشم از دست این #C شماها بازم به همون java خودمون
چون سوالات به هم بربوطه پس همشو یک جا میپرسم کسی گله و شکایت نکنه همینه که هست

1- مگه یه فرم یه کلاس نیست ! پس چرا هر فرم در برنامه ما وقتی ذخیره میشه دو تا فایل روی هارد ذخیره میشه
2- من میتونم توی یک فایل دوتا کلاس تعریف کنم و هیچ ربطی با هم نداشته باشه
3- من میتونم یک کلاس رو توی دوتا فایل بنویسم مثلا 10 متد های کلاسمو توی فایل اول و 10 دیگشو توی یه فایل دیگه
4- اصلا این چه منطقی که کد هایی که توسط خود IDE تولید میشود توی یه فایل دیگه ذخیره میشود


سوالات همچنان ادامه دارد منتظر جواب های منطقی و قانع کنند هستم
هر چند سوالاتم خیلی منطقی نیست!

mehdi.mousavi
پنج شنبه 19 مهر 1386, 19:13 عصر
دوستان من دارم دیوانه میشم از دست این #C شماها بازم به همون java خودمون
چون سوالات به هم بربوطه پس همشو یک جا میپرسم کسی گله و شکایت نکنه همینه که هست

1- مگه یه فرم یه کلاس نیست ! پس چرا هر فرم در برنامه ما وقتی ذخیره میشه دو تا فایل روی هارد ذخیره میشه
2- من میتونم توی یک فایل دوتا کلاس تعریف کنم و هیچ ربطی با هم نداشته باشه
3- من میتونم یک کلاس رو توی دوتا فایل بنویسم مثلا 10 متد های کلاسمو توی فایل اول و 10 دیگشو توی یه فایل دیگه
4- اصلا این چه منطقی که کد هایی که توسط خود IDE تولید میشود توی یه فایل دیگه ذخیره میشود


سوالات همچنان ادامه دارد منتظر جواب های منطقی و قانع کنند هستم
هر چند سوالاتم خیلی منطقی نیست!


سلام.
1. درسته. یه فرم، یه کلاسه که از یه کلاس فرم درایو میشه. هر فرم، حاوی Resource هایی هستش (از قبیل String، Image و ... ) که باید به نوعی در جایی ذخیره بشن. اگر قرار بود، اینها هم در همون فایل کلاس اصلی (فرم) ذخیره بشن، اونوقت تو اون کلاس آشوبی بر پا میشد. چون باید Resource ها رو Binary نگه می داشتن و ... از طرف دیگه، یه Resource مربوطه به یه Locale خاص میشه. اینو هم به مساله اضافه کنید تا ببینید نگهداری Resource ها در کلاس اصلی چقدر کد رو ناخوانا میکرد. پس یه فایل دیگه با دنباله .resx درست کردن تا Resource ها رو تو اون نگه دارن.

اما این پایان کار نیست. تو نسخه 1.1 dotNet Framework، تابع InitializeComponent در فایل اصلی برنامه تشکیل میشد، در نتیجه هر برنامه نویسی ممکن بود به اشتباه در این قایل دست ببره و مشکلاتی رو برای برنامه بوجود بیاره. ضمن اینکه بسیاری از افراد، (از جمله خود من) به این مساله معترض بودن که این کد باید بگونه ای به Designer ربط پیدا کنه و پشت پرده باید وجود داشته باشه، نه اینکه همراه کد اصلی در کلاسی که من از ابتدا ایجاد میکنم، قرار بگیره.

اینجا بود که Microsoft کلمه کلیدی partial رو به .NETFramework 2.0 اضافه کرد. به این ترتیب، دیگه نیازی نبود که برنامه نویس تو کد Auto-Generate شده Compiler دست ببره...

از اونجاییکه تابع InitializeComponent از طریق Designer فراخوانی میشه، تیم VS تصمیم گرفتن تا این تابع رو در فایل جداگانه ای به اسم myFormClass.Designer.cs قرار بدن و به این دلیله که یه فرم ساده، حاوی 3 تا فایل متفاوت هستش...

2. بله. شما میتونید کل یه پروژه چند لایه رو در یک فایل و تنها یک فایل بنویسید و Compile کنید. اما چنین برنامه ای جدا از مشکلات زمان Compile و ...، مطمئنا از Performance پایینی هنگام Compile برخوردار خواهد بود. ضمن اینکه خوانایی برنامه از بین خواهد رفت.

3. بله. در dotNetFramework 2.0، همونطوری که گفتم، partial keyword به استاندارد CLR اضافه شد تا این امکان فراهم بشه. چون در بسیاری از موارد (از جمله DataSet ها)، نیاز هست تا توابع جدیدی به کدهای Auto-Generate شده توسط برنامه نویس اضافه بشه.

4. فکر میکنم در 3 شماره قبلی براتون کامل توضیح داده باشم.

PC2st
پنج شنبه 19 مهر 1386, 21:08 عصر
خیلی زیبا پاسخ دادید... متن خوانا و پر محتوا بود، من که کف کردم!
فقط یک نکته رو حواستون نبود: "برنامه نویس تو کد Auto-Generate شده Compiler دست ببره"
فکر کنم منظورتون IDE بوده :-)

Mahdi.Kiani
پنج شنبه 19 مهر 1386, 22:09 عصر
خیلی زیبا پاسخ دادید... متن خوانا و پر محتوا بود، من که کف کردم!


واقعا ؟
مطالبی که گفته شد جزء اصول اولیه دات نت 2 هست :متفکر:

mehdi.mousavi
جمعه 20 مهر 1386, 00:35 صبح
خیلی زیبا پاسخ دادید... متن خوانا و پر محتوا بود، من که کف کردم!
فقط یک نکته رو حواستون نبود: "برنامه نویس تو کد Auto-Generate شده Compiler دست ببره"
فکر کنم منظورتون IDE بوده :-)

منظورم از Compiler، در واقع Visual Studio بود. ببخشید!

mohammad272005
جمعه 20 مهر 1386, 02:07 صبح
فکر نمی کنم دیگه چیزی واسه گفتن مونده باشه. خداییش کامل بود.

alireza_tavakol
جمعه 20 مهر 1386, 03:28 صبح
امید وارم از سوالات من خسته نشید
از کلیه دوستان که در بحث های بی محتوای من شرکت میکنند صمیمانه تشکر میکنم
اما

اینجا بود که Microsoft کلمه کلیدی partial رو به .NETFramework 2.0 اضافه کرد. به این ترتیب، دیگه نیازی نبود که برنامه نویس تو کد Auto-Generate شده Compiler دست ببره...
اگه زحمتی نیست به صورت خودمونی یه مقدار در رابطه با partial توضیح بدین

راستی من منظورتو از جمله زیر نفهمیدم

از اونجاییکه تابع InitializeComponent از طریق Designer فراخوانی میشه


ادامه سوالات
5- من چه طوری میتونم توی فرم 2 از InitializeComponent فرم 1 استفاده کنم
6- من یه کلاسی دارم میخواهم جنبه طراحی رو به اون اضافه کنم که مثل فرم بشه باید که تغییراتی توی کلاس معمولیم بدم

مژده به تمام علاقه مندان سوالات همچنان ادامه دارد:قهقهه:

mohammad272005
جمعه 20 مهر 1386, 03:46 صبح
اگه زحمتی نیست به صورت خودمونی یه مقدار در رابطه با partial توضیح بدین
partial به این معنیه که یه کلاس (ی که partial شده) می تونه توی چند فایل، پیاده‏ساری بشه. شما می‏تونی فرض رو بر این بگیری که تمام کلاس تو یه فایله. فقط برای خواناتر شدن و دسته‏بندی بیشتر کلاس، اونو تو چند فایل تقسیم می‏کنن. کلاس partial از دید CLR هیچ فرقی با کلاس non-partial نداره.

5- من چه طوری میتونم توی فرم 2 از InitializeComponent فرم 1 استفاده کنم
چه لزومی داره اینکارو بکنی؟ اگه بخوای می‏تونی بسادگی propertyةای public اونو تغییر بدی.
در زمان طراحی فقط و فقط کافیه از کلاس System.Windows.Forms.Form ارث ببره.

PC2st
جمعه 20 مهر 1386, 15:54 عصر
واقعا ؟
مطالبی که گفته شد جزء اصول اولیه دات نت 2 هست :متفکر:
باید از مطلبی بی اطلاع باشم تا ازش خوشم بیاد؟ :متفکر:



به صورت خودمونی یه مقدار در رابطه با partial توضیح بدین
در حالت عادی، یک کلاس تنها و تنها در یک فایل میتونه تعریف بشه و بعبارتی، یک کلاس فقط میتونه در یک جا تعریف داشته باشه. partial یک کلمه کلیدی است که اگر در اعلان تعریف کلاس بکار برده بشه، باعث خواهد شد که تعریف یک کلاس رو در جاهای مختلفی کاملتر کنیم و بعبارتی یک کلاس میتونه در چندین جا تعریف خودش رو کاملتر کنه.


6- من یه کلاسی دارم میخواهم جنبه طراحی رو به اون اضافه کنم که مثل فرم بشه باید که تغییراتی توی کلاس معمولیم بدم
اگر میخواید که کلاستون ظاهر گرافیکی GUI داشته باشه و بشه توسط Designer بهش کنترل اضافه کرد، میتونید کلاس رو از نوع UserControl مشتق کنید که در اینصورت کلاس یک Control خواهد بود.

alireza_tavakol
جمعه 20 مهر 1386, 17:13 عصر
من چه طوری میتونم توی فرم 2 از InitializeComponent فرم 1 استفاده کنمچه لزومی داره اینکارو بکنی؟ اگه بخوای می‏تونی بسادگی propertyةای public اونو تغییر بدی.
دوست عزیز فرض مسئله من این است که در فرمی متد های خواصی تعریف شده است ولی در صورت چک کردن شرطی میخواهم طراحی فرم شماره 1 را داشته باشد و در صورت عدم صحت شرط طراحی فرم شماره 2 را داشته باشد
و بنده حقیر می خواهم بدون امکان صدا زدن InitializeComponent فرم دیگری برای فرم خواصی امکان پذیر است
لطفا به سوال پاسخ دهید و به فکر حل مشکل از روش دیگری نباشید
با تشکر فراوان
عید سعید فطر را به همه شما تبریک عرض می نمایم

alireza_tavakol
جمعه 20 مهر 1386, 17:15 عصر
اگر میخواید که کلاستون ظاهر گرافیکی GUI داشته باشه و بشه توسط Designer بهش کنترل اضافه کرد، میتونید کلاس رو از نوع UserControl مشتق کنید که در اینصورت کلاس یک Control خواهد بود.
میشه یه کم بیشتر واسم توضیح بدین البته من نمیدونم با چه زبونی از شما تشکر کنم PC2st.ir
اگه یه مثال باشه که دیگه محشر

PC2st
جمعه 20 مهر 1386, 23:50 عصر
میشه یه کم بیشتر واسم توضیح بدین البته من نمیدونم با چه زبونی از شما تشکر کنم PC2st.ir
خواهش میکنم :بامزه:
من رو به شک انداختید که شاید منظورتون رو خوب متوجه نشده باشم... از جمله: "میخواهم جنبه طراحی رو به اون اضافه کنم"، آیا منظورتون این بود که میخواهید بدون کد نویسی کلاستون رو طراحی کنید؟ یعنی اینکه میخواید یک کلاس تعریف کنید که بتونه روی یک Form قرار بگیره و در واقع میخواید یک کنترل بسازید که حاوی 3 تا TextBox باشه و میخواید این TextBox ها رو از طریق Visual Studio Designer به کنترلتون اضافه کنید و کد ننویسید؟ اگر منظورتون این بود، و کلاستون یک کنترل بود، میتونید اون رو از کلاس UserControl مشتق کنید، همانطور که میدونید با ارث بری از کلاس Control میشه یک کنترل ایجاد کرد ولی نمیشه از طریق VS Designer اون رو ویرایش کرد و فقط باید کدهاشو نوشت، اما اگز از userControl به ارث برسونید علاوه بر اینکه یک کنترل هست، میتونید از طریق VS Designer هم اون رو ویرایش کنید و مثلا TextBox ها رو به آن Drag and Drop کنید. برای ارث بری از userCOntrol یک کلاس جدید به پروژه اضافه کنید (cs.*) و سپس به قسمت ویرایش کدهاش بروید و کلاس رو از UserCOntrol به ارث برسونید، مثلا:


class Class1 : System.Windows.Forms.UserControl
{
...
}

حالا اگر روی نام Class1.cs دو بار کلیک کنید، به حالت ویرایشگر Design میروید و میتونید TextBox ها رو روی اون بکشید و رها کنید.
اعمال فوق رو با افزودن یک UserControl میشد سریعا انجام داد. (یعنی یک UserControl بجای Class به پروژه اضافه میکردید و دیگه نیازی به تغییرات بالا نبود.)

وقتی که این سوال رو پرسیدید، به نظرم اومد که سوال رو اشتباه متوجه شدم، اگر اینطور بود، لطفا کمی بیشتر توضیح بدید.

alireza_tavakol
شنبه 21 مهر 1386, 00:11 صبح
تقریبا منظورم هم این بود اما نه به این صورتی که شما پاسخ دادین
من یه کلاس معمولی دارم
می خواهم کلاسم از System.Windows.Forms ارث بری بکنه
و وقتی روی عنوان نام Class1.cs دو بار کلیک کنم، به حالت ویرایشگر Design برود و بتونم TextBox ها رو روی اون بکشم و رها کنم.
اما توی خود کلاس کد های مربوط به InitializeComponent را ننویسه و توی یه فایل جداگانه اون ها رو بنویسه

خودم میدونم سوالم یه کم ناجور اما خوب سوال دیگه دست درد نکنه که جواب میدی

alireza_tavakol
شنبه 21 مهر 1386, 01:39 صبح
دوستان آخرین پست از صفحه اول جانمومه:گیج:

PC2st
شنبه 21 مهر 1386, 22:21 عصر
اما توی خود کلاس کد های مربوط به InitializeComponent را ننویسه و توی یه فایل جداگانه اون ها رو بنویسه
این مورد به نوع IDE مورد استفاده بر میگرده... فکر نمیکنم بشه و اگر هم بشه متاسفانه بلد نیستم.



دوست عزیز فرض مسئله من این است که در فرمی متد های خواصی تعریف شده است ولی در صورت چک کردن شرطی میخواهم طراحی فرم شماره 1 را داشته باشد و در صورت عدم صحت شرط طراحی فرم شماره 2 را داشته باشد
متد InitializeComponent برای این منظور طراحی و پیاده سازی نشده است ولی میتونید یک متد (یا حتی کلاس) برای این منظور تعریف کنید که پارامتری از نوع Form را دریافت کرده و تغییرات (افزودن کنترل و غیره) را روی آن اعمال کند. یا اینکه برای انتخاب طراحی فرم شماره 1 یا 2، میشد از ارث بری استفاده کرد.