PDA

View Full Version : گفتگو: کلاس ها



seven7777777
پنج شنبه 03 اردیبهشت 1388, 09:28 صبح
دوستان سلام

می خواستم ببینم این کلاس به چه درد می خوره ؟
آخه به کله ناقص من به جز خاصیت کپسوله بودن و Information Hiding اون چیزی نمی رسه یعنی نمی تونم اونو با تابع متمایز بدونم و فرقی براشون قائل بشم !!!

esmaeily-hosein
پنج شنبه 03 اردیبهشت 1388, 09:58 صبح
فرض کن اگر تو مدرسه کلاس وجود نداشته باشه چی میشه .

seven7777777
پنج شنبه 03 اردیبهشت 1388, 10:05 صبح
خوب اینجا راهکاری مثل تابع داریم .
مثل اینکه تو مدرسه کلاسو به جای دیوار با یه چیز دیگه بسازن مثلا partitin یا چیز دیگه . یعنی اضافه کاری ساخت کلاس رو چطور میشه توجیح کرد . به جای اینکه یه پارتیشن ساده بذارن بیان کلی دیوار کشیو بعدشم گچ خاکو بعدشم رنگو ...

در ضمن الان دیگه این کلاسا فایده نداره از دست این بچه ها ، باید با بتون تو عمق زمین کلاس بسازن .:لبخند:

esmaeily-hosein
پنج شنبه 03 اردیبهشت 1388, 10:11 صبح
C# is everything class
در C# همه چیز کلاس است تا وقتی که به دنیای واقعی نیایند وقتی آنجا آمدند به شی یا Instance تغییر نام میدهند .
به محیط خودت نگاه کن مثلا یه خودکار در نظر بگیر .
خودکار شما خاصیتهایی مانند رنگ و نوع و ... میباشد ما به این خاصیت ها میگیم props .
ما از این خودکار توقع نوشتن داریم به این رفتاره میگیم method
این خودکار امکان داره رنگش تموم بشه ما به این رویدادها میگیم event
و مفاهیم دیگر ما به مجموع اینها میگیم کلاس .
امیدوارم متوجه شده باشی class

seven7777777
پنج شنبه 03 اردیبهشت 1388, 10:19 صبح
البته من این گفتگو رو راه انداختم تا به صورت عمقی کلاسو یاد بگیرم چون خیلی دوست دارم ولی منظور من از کلاس ، کلاس هایی هست که خودمون می نویسیم مثلا چرا برای داشتن یک textbox که فقط رقم بگیره باید یه کلاس بنویسیم ، در حالی که با یه تابع ساده میشه این کارو کرد ؟؟؟

esmaeily-hosein
پنج شنبه 03 اردیبهشت 1388, 10:29 صبح
میتونم بگم کلا اساس .net بر محور think small code بود .
تو به فرض میگی میخوام یه تابع بنویسم (من بهش میگم method ) اونو 5 جا call کنم تا textbox های من عدد بگیره من میگم به جای این کار یه NumericTextBox درست میکنم هر جا خواستم از اون استفاده کنم . و دیگه اون 5 بار فراخوانی دیگه ندارم . شاید این موضوع برات توی یه پروژه کوچیک هیچی نباشه ولی وقتی برنامت یه کم بزرگ بشه اونوقت بیشتر درک میکنی .
نکته : در ضمن کلاس کلاسه فرقی نمیکنه تو بنویسی یا کس دیگه .
برای بیشتر فهمیدن میتونی درباره Design Pattern ها تحقیق کنی .

newgoldenman
پنج شنبه 03 اردیبهشت 1388, 10:52 صبح
سلام.
من یه ربع تایپ كردم موضوعی كه میخواستم برات بفرستم اینجا، دكمه ی ارسال رو كه زدم، طبق بعضی روال ها توی برنامه نویس، انگار پست نشد و دیگه هم نتونستم برش گردمونم با بازگشت به صفحه ی قبلی.

من شنبه و یكشنبه میرم دانشگاه sevenn77777 جان! اگه هستی اون طرفا، یه بوق بزن ببینمت. این سوالت رو هم به نحو احسن برات موضوع رو روشن میكنم برات!

فدای تو، موفق باشی

seven7777777
پنج شنبه 03 اردیبهشت 1388, 11:30 صبح
دوست خوبم از اینکه در بحث شرکت کردی ممنون .

خوب شما هم باید 5 جا از این کلاست شی بسازی دیگه ؟؟؟

حالا چه فرقی می کنه آدم 5 بار شی بسازه یا 5 بار تابع صدا بزنه ؟؟؟

می دونی یه جوری اگه تابع نوشته شده رو تو event همون textbox عادی صدا بزنی ، مثل اینه که انگار اومدی کلاس textbox رو اونجور که خواستی تغییر دادی و یه کلاس جدید نوشتی .

در مورد Design Pattern حتما تحقیق می کنم .
======================================
سلام عزیزم

خوبی ؟ خیلی خوشحالم کردی . منتظرتم . بلکه این مخ ناقص ما کار بیافته !!!

esmaeily-hosein
پنج شنبه 03 اردیبهشت 1388, 11:43 صبح
همون در مورد Design Pattern ها تحقیق کنی فکر کنم بهتره ! به مدل factory بیشتر دقت کن .

mohsen_csharp
پنج شنبه 03 اردیبهشت 1388, 12:25 عصر
چرا برای داشتن یک textbox که فقط رقم بگیره باید یه کلاس بنویسیم ، در حالی که با یه تابع ساده میشه این کارو کرد ؟؟؟دوست عزیز شما این تابع ساده رو بنویس و اینجا بزار تا من هم با مثال های بیشتر به شما لزوم وجود کلاس رو تو ضیح بدم.
فرض کن 5 تا textBox داریم و مقادیر مجاز ورودی برای هر textBox عددی بین x و y باشه که این x و y ها برای textBox های مختلف مقادیر مختلفی داشته باشه.

seven7777777
پنج شنبه 03 اردیبهشت 1388, 14:09 عصر
دوست عزیز اینم از تابع :


private bool checknum(int min, int max, Char key)
{
if (min < max)
{
int code = (int)key;
if (code > 47 && code < 58)
if (int.Parse(key.ToString()) > min && int.Parse(key.ToString()) < max)
return true;
}
return false;
}

کافیه اونو تو رویداد KeyPress تکست باکس به شکل زیر استفاده کنی :


if (checknum(3, 7, e.KeyChar))
e.Handled = false;
else
e.Handled = true;


برای هر تکست باکسی کافیه همین 4 خط بالارو براش بنویسی تو رویدادش .

salehbagheri
پنج شنبه 03 اردیبهشت 1388, 15:11 عصر
ببين دوست من!

همونطور كه كلاس هاي مدرسه براي دسته بندي دانش آموزان است! كلاسهاي برنامه نويسي هم براي دسته بندي توابع است!
چون شما از يه تابع استفاده كرديد، احتمالا اين تصور اشتباه براتون پيش اومده!

مثلا شما ميخواهيد توابع رياضي رو براي استفاده ديگران، بنويسيد! اين توابع عبارتند از :ACos, ASin, ATn,Exp,Sqart,Floor,Min,Max,...

شما اگه اين توابع رو دسته بندي نكنيد، زماني كه توابع گوناگون زيادي نوشتيد، يقيناً در دسترسي به اين توابع دچار مشكل خواهيد شد! در نتيجه اين توابع رو در كلاسي دسته بندي ميكنيد كه دسترسي بهش آسانتر باشه! (اين توابع توسط مايكروسافت در فضاي نام System و در كلاس Math دسته بندي شده و در اختيار همه قرار گرفته!)
يا مثلاً كلاس Label كه شامل توابعي است كه ميتونه متني رو بگيره و اون رو روي فرم رندر كنه و تو مانيتور نمايش بده!

نتيجه گيري: به نظر من و طبق تجربيات ناقص من، كلاسها وظيفه‌اي همانند Namespace ها دارند! يعني دسته بندي توابع و متدها (اگر چنين چيزي نيست لطف كنيد و بگيد)



مثلا چرا برای داشتن یک textbox که فقط رقم بگیره باید یه کلاس بنویسیم ، در حالی که با یه تابع ساده میشه این کارو کرد ؟؟؟

كلاس، نوشتن نداره عزيز! منظور آقا اين بوده كه اون تابع ساده خودتون رو در يك كلاس دسته بندي كنيد! تا دسترسي بهش ساده تر بشه!
درسته كه به خود تابع هم ميشه به راحتي دسترسي داشت ولي اين طوري استانداردتره!!! و در برنامه هاي بزرگتر خودشو نشون ميده!

seven7777777
پنج شنبه 03 اردیبهشت 1388, 15:35 عصر
خوب اگه اینجوری باشه درکش یه کم راحت تره !!!

یه جایی که توابع مربوط به هم رو دسته بندی کنیم . آیا دوستان این نظرو قبول دارند ؟؟؟

mohsen_csharp
پنج شنبه 03 اردیبهشت 1388, 16:44 عصر
دوست عزیز اینم از تابع :
کد:

privatebool checknum(int min, int max, Char key)
{
if (min < max)
{
int code = (int)key;
if (code > 47 && code < 58)
if (int.Parse(key.ToString()) > min && int.Parse(key.ToString()) < max)
returntrue;
}
returnfalse;
}

کافیه اونو تو رویداد KeyPress تکست باکس به شکل زیر استفاده کنی :
کد:

if (checknum(3, 7, e.KeyChar))
e.Handled = false;
else
e.Handled = true;

برای هر تکست باکسی کافیه همین 4 خط بالارو براش بنویسی تو رویدادش . دوست عزیز کد شما غلطه.
این کد در هر لحظه فقط می تونه کاراکتر ورودی رو بررسی کنه و اگه یک string رو با موس روی تکس باکس paste کنی مینینی که اصلا این رویداد KeyPress اتفاق نمی افته .
در ثانی من اگه بخوام مقداد min=20 وmax=75 باشه اونوقت باید چجوری از کد شما استفاده کنم چون کد شما فقط در هر لحظه یک کاراکتر ورودی رو بررسی می کنه . تابع checknum رو با چه پارامترهایی فراخوانی کنم.
دیدید دوست عزیز به این سادگی ها هم که فکر می کنید نیست !
راهنمایی : شما به مقدار قبلی textBox نیاز دارید
سعی کنید کد را اصلاح کنید تا من به شما بگم در این مثال ضرورت وجود کلاس چیه؟

mohsen_csharp
پنج شنبه 03 اردیبهشت 1388, 16:49 عصر
یه جایی که توابع مربوط به هم رو دسته بندی کنیم . آیا دوستان این نظرو قبول دارند ؟؟؟
نه دوست عزیز این حرف شما را قبول ندارم. مگه توی یک کلاس فقط توابع ذخیره میشه ؟
پس فیلدها و خاصیت ها و رویداد ها و ... مربوط به هر شی ، کجا ذخیره میشن؟

Unknownlive
پنج شنبه 03 اردیبهشت 1388, 17:51 عصر
نتيجه گيري: به نظر من و طبق تجربيات ناقص من، كلاسها وظيفه‌اي همانند Namespace ها دارند! يعني دسته بندي توابع و متدها (اگر چنين چيزي نيست لطف كنيد و بگيد)

Unknownlive
پنج شنبه 03 اردیبهشت 1388, 17:53 عصر
نتيجه گيري: به نظر من و طبق تجربيات ناقص من، كلاسها وظيفه‌اي همانند Namespace ها دارند! يعني دسته بندي توابع و متدها (اگر چنين چيزي نيست لطف كنيد و بگيد)

فکر کنید 20 تابع دارید در قسمتی برنامه حالا می خواهید در قسمتی دیگر با کمی تغیرات اون 20 تارا درست کنید این کاری است که وجود کلاس ان را راحت تر می کند شما اون 20 تا در یک کلاس می نویسید و در قسمت دوم برنامه از ان یک ارث می برید در ضمن بر امنیت دسترسی اعضا هم می توانید کنترل داشته باشید

mohsen_csharp
پنج شنبه 03 اردیبهشت 1388, 19:25 عصر
نتيجه گيري: به نظر من و طبق تجربيات ناقص من، كلاسها وظيفه‌اي همانند Namespace ها دارند! يعني دسته بندي توابع و متدها (اگر چنين چيزي نيست لطف كنيد و بگيد)

فکر کنید 20 تابع دارید در قسمتی برنامه حالا می خواهید در قسمتی دیگر با کمی تغیرات اون 20 تارا درست کنید این کاری است که وجود کلاس ان را راحت تر می کند شما اون 20 تا در یک کلاس می نویسید و در قسمت دوم برنامه از ان یک ارث می برید در ضمن بر امنیت دسترسی اعضا هم می توانید کنترل داشته باشیدنه دوست من
در پست شماره 15 اشاره کردم که

نه دوست عزیز این حرف شما را قبول ندارم. مگه توی یک کلاس فقط توابع ذخیره میشه ؟
پس فیلدها و خاصیت ها و رویداد ها و ... مربوط به هر شی ، کجا ذخیره میشن؟ شما نیز مانند seven7777777 (http://barnamenevis.org/forum/member.php?u=38006) سعی کنید آن متد را پیاده سازی کنید تا با اشکالات آن ، لزوم وجود کلاس ها رو توضیح بدم.(متدی که textBox فقط مقدار عددی بین x تا y رو بگیره)
به عنوان مثال x=20 و y=75

salehbagheri
پنج شنبه 03 اردیبهشت 1388, 21:48 عصر
فکر کنید 20 تابع دارید در قسمتی برنامه حالا می خواهید در قسمتی دیگر با کمی تغیرات اون 20 تارا درست کنید این کاری است که وجود کلاس ان را راحت تر می کند شما اون 20 تا در یک کلاس می نویسید و در قسمت دوم برنامه از ان یک ارث می برید در ضمن بر امنیت دسترسی اعضا هم می توانید کنترل داشته باشید


اگر كلاس ها با فضاي نامها تفاوتي نداشت، بوجود نمي آمد! بخاطر همين ويژگي هاش هست كه بوجود آمده!



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

دوست من! منظور من توابع نبود! در كل منظور دسته بندي بود! شما هم بهتره روي دسته بندي Focus كنيد! نه توابع!

در ضمن اين خاصيت ها و رويدادها و ... در كلاس ذخيره نميشند، بلكه يك كلاس اونها رو دسته بندي ميكنه!

Unknownlive
پنج شنبه 03 اردیبهشت 1388, 22:21 عصر
می دونی چرا یک TEXT BOX کلاس داره؟برای این که اگه حرفه ای کار کنی حتما خاصیت ها و متد های این TEXTBOX ها جواب گو نیست بنابر این باید خاصیت به ان اضافه کنی در نتیجه یه کلاس می نویسی که از اون مشتق بگیره و یک متغیری از نوع ابجکت TEXT BOX باشه و بعد به ان خاصیت اضافه می کنی و از ان استفاده می کنی

vahid.bz
پنج شنبه 03 اردیبهشت 1388, 23:07 عصر
سلام
تمثیلاً کلاس ها در برنامه نویسی مثل اشیا در واقعیتند
من از شما می خوام صدا رو زیاد کنی؟
حتماً پرسیدی صدای چیو؟رادیو-تلویزیون-....
شما که تابع رو کافی می دونی باید بدونی که هر تابع با کلاسش معنی پیدا می کنه
درسته می شه برنامه رو با تابع سرهم کرد اما چند ماه بعد اگه برنامتو ببینی یادت نیست چی نوشتی
باتوجه به تشکیل تیم های برنامه نویسی و به اشتراک گذاشتن برنامه ها وضوح در اونا بسیار اهمیت داره
و این کلاس ها هستند که می گن زیاد کردن صدا که یک تابع مربوط به صدای تلویزیونه نه رادیو
---------------------------------------------------------------------------------------------------------------------
آبی که براسود زمین اش بخورد زود دریا شود آن رود که پیوسته روان است

seven7777777
جمعه 04 اردیبهشت 1388, 11:11 صبح
خوب البته تابع کار راحتی ولی من اینقدر وارد نیستم !!!:ناراحت:

راستش به نظر من کلاس هم چیز با کلاسیه هم بدرد بخور اما چون نمی تونستم تفاوتی بین اون و تابع قائل بشم و شایدم ترس از استفاده از اون استفاده نمی کردم .

دوستان با پاسخ های خوبشون منو مجاب کردن ( تقریبا ) ؟؟؟
پاسخ دوستمون vahid.bz خیلی قشنگ بود . حالا یه سوال دیگه . من این سوالو اینجامی پرسم چون اسم پست رو کلی انتخاب کردم که مشکلی پیش نیاد .

حالا چطور میشه یه کلاس نوشت ؟ چه نیازهایی داره و چه تکنیک هایی لازم داره ؟

vahid.bz
جمعه 04 اردیبهشت 1388, 16:43 عصر
حتماً فایل ضمیمه رو با توضیحات وفق بده
فایل ضمیمه txt برا اینکه کارای زیرو خودت انجام بدی:
در #c بعد از باز کردن یک پروژه در سمت راست یا معمولاً در سمت چپ یک tab با نام solution explorer موجود است در این قسمت با راست کلیک کردن روی نام پروژه و بعد گزینه ی add و بعد از اون گزینه ی ...class رو انتخاب می کنی در پنجره ی template گزینه ی class و در قسمت Name بدون دست زدن به پسوند.cs. نام کلاستو انتخاب می کنی وروی Add کلیک می کنی.با انجام این کارها محیطی برای تکمیل کلاس در اختیارت قرار می گیره.
هر کلاس بشکل زیر نوشته می شه:
()نام کلاس class
}
{
تا اینجا رو محیط فراهم شده براتون مینویسه
کلاس در #c ازچهار قسمت تشکیل شده :
1.متغیرهای شیی
2.خا صیت ها
3.متدها
4.سازنده
1.متغیرهای شیی:اون چیزایی که داخل تلویزیونه وما نمیتونیم با اونا کار کنیم.
هر متغیر شیی رو داخل دو کروشه به فرم زیر باید بنویسی:
;اسم متغیر نوع متغیر نوع دست یابی
مثلاً: ; private string Name
2.خاصیت ها با تو جه به مفهوم کپسوله سازی متغیرها private به کار می روند و برای دستیابی به اون هادر قسمت هایی که نوع private اجازه ی دستیابی ندارد برای حفظ مفهوم کپسوله سازی به فرم زیر به کار می روند(کاربردش مفصل تره )
نام خاصیت نوع ای که برمی گردونه نوع دستیابی
}
get {}
set {}
}
3.متد ها یا توابع: وقتی چیزی ساختی که درجه ی صدا رو زیاد کنه تابعی نوشتی که صدای شی کلاستو زیاد میکنه و به فرم زیر داخل دو کروشه ی کلاس نوشته می شه:
{}(پارامترها)نام متد مقدار بازگشتی نوع دستیابی 4.سازنده: 1.همنام با کلاس 2.مقدار بازگشتی نمی نویسی براش حتی void
دو نوع سازنده داریم یکی پیش فرض که همیشه به فرم زیر و توصیه می کنم در همه ی کلاسات بنویسش:
{}()نام کلاس
یکیم برا مقدار دهی متغیرات:
(پارامترها به اندازه وسنخیت متغیرهای شیی)نام کلاس
{هر پارامتر برابر با متغیر شیی هم سنخش شود+هر کار لازم دیگری} موفق باشی

mohsen_csharp
شنبه 05 اردیبهشت 1388, 09:53 صبح
دوست من! منظور من توابع نبود! در كل منظور دسته بندي بود! شما هم بهتره روي دسته بندي Focus كنيد! نه توابع!
آقای salehbagheri (http://barnamenevis.org/forum/member.php?u=39960) عزیز اگر منظور شما توابع نیست پس چرا می نویسید توابع؟ منظور خود را صریح بیان کنید. چون بعضی اوقات از بعضی از کلاس ها فقط به عنوان دسته بندی توابع اونم به صورت استاتیک استفاده می شه مانند کلاس های math و convert .
چرا باید روی دسته بندی فوکوس کنم در حالی که دسته بندی فقط یکی از مزایای کلاس ها است. در حالی که مزایای دیگری مانند پنهان سازی ، کنترل داده های ورودی ، مدیریت منابع مربوط به خود ، کنترل رویداد ها (توجه کنید که یک رویداد را می توان فقط از داخل یک کلاس به صورت صریح rise کرد ولی در delegate ها این گونه نیست) ، ارث بری ، ارث بری چندگانه به کمک اینترفیس ، و ... را به ارمغان می آورد.

در ضمن اين خاصيت ها و رويدادها و ... در كلاس ذخيره نميشند، بلكه يك كلاس اونها رو دسته بندي ميكنه! مگه من گفتم این موارد در کلاس ها ذخیره میشن؟
بنده عرض کردم

پس فیلدها و خاصیت ها و رویداد ها و ... مربوط به هر شی ، کجا ذخیره میشن؟ یعنی این موارد در اشیائ نمونه سازی شده از کلاس ها ، ذخیره میشن.

salehbagheri
شنبه 05 اردیبهشت 1388, 11:41 صبح
چرا باید روی دسته بندی فوکوس کنم در حالی که دسته بندی فقط یکی از مزایای کلاس ها است.

دوست عزيز! حرفهاي شما درست! ولي دسته بندي هدف اصلي كلاس ها بود و به همين خاطر به وجود آمد! ويژگي هايي كه گفتيد بعد بهش اضافه شد!

اما وقتي ديدند كه تعداد كلاسها هم زياد شده و دسترسي بهش سخت شده، فضاهاي نام بوجود آمد!

يه مثال ميزنم شايد حرفام مفهومتر بشه!
در يك دانشگاه، هدف اصلي يك كلاس، در ابتدا، جدا كردن دانشجويان از ساير دانشجويان است!
حالا اون كلاس از چه بخشي از دانشگاه تبعيت ميكنه يا در اون كلاس چي درس ميدن، چگونه با دانشجو رفتار ميكنند و ... در اولويت هاي بعديه!

كلاسهاي برنامه نويسي هم همينطوره! ابتدا متدهاي مرتبط به هم رو در يك جا دسته بندي ميكنه!
حالا اينكه از چه چيزي ارث ميبره، با متدها چه رفتاري ميشه، داده ها رو كنترل ميكنه يا نه، به ويژگيهاي بعدي كلاس مربوطه عزيز!

با تشكر!

حامد مصافی
شنبه 05 اردیبهشت 1388, 12:00 عصر
می دونی چرا یک TEXT BOX کلاس داره؟
چون در معماری شی گرای دات نت چیز دیگری نمی تواند باشد.

esmaeily-hosein
شنبه 05 اردیبهشت 1388, 12:30 عصر
همانطور که تو پست های قبلم گفتم کلاس شی است که هنوز به دنیای واقعی نیامده است .
و کلا هدف ایجاد کلاس پیاده سازی مفهوم object در oo بوده و اگرنه خاصیت های بالا رو همشو struct هم داره .
هدف از ایجاد کلاس فقط و فقط پیاده سازی مفاهیم oo بوده و هیچ چیزی غیر از این نیست .

quantomquery
شنبه 05 اردیبهشت 1388, 15:07 عصر
سلام
یه بحث دیگه توی کلاس موضوع وراثت و چند ریختی مطرحه که متاسفانه خیلی کم به اون توجه می شه .
یعنی اینکه اگه ما یه کلاس بزرگی داشته باشیم و بخواهیم اشیا خاصی رو از اون بسازیم با تعریف یه سازنده و کدهایی که فرزند باید اظافه کند ، از نوشتن کل اون کلاس بزرگ برای همه اون اشیا جلو گیری کردیم .
و حالا فکر کنیم برای ادامه برنامههرکدام از آن فرزند ها هم می توانند والد برای فرزندان دیگر باشند .
البته خود کلاس مجموعهای از توابع است که مربوطبه اون شی است که رفتار نامیده می شه و یکسری خواص .
تو برنامه های ساختیافته (بر پایه تابع ) که ما می نویسیم تمام توابع ما بر اساس نوع کارمان هست یعنی مثلا در کتابخانه ما توابعی برای اجاره کتاب ، فروش کتاب و ... داشتیم ولی مباحث شی گرایی که بر پایه کلاس نویسی هست موجودیت مطرح می شود نه کار ، مثل موجودیت کتاب و کارمند و ....
و همین اگه در برنامه های بزرگ استفاده بشه شاید چند هزار خط روتبدیل به چند صد خط بکنه
همون خاصیت کپسوله سازی رو هم که اشاره کردی چیز کمی نیست . خب وقتی بتونی برنامه ای بنویسی که یک متغیر رو تو اون فقط خوندنی کنی و یا اینکه یک کلاس به صورت protected بتونه متغیر هاش روبرای فرزندانش قابل دسترسی کنه خودش چیز کمی نیست .

seven7777777
دوشنبه 07 اردیبهشت 1388, 09:02 صبح
دوستان من بالاخره یه کلاس نصفه نیمه نوشتم .
حالا می خوام کاری کنم که از کلاسم شی نسازم فقط با نامش کار کنم . چطوری این کارو انجام بدم ؟؟؟

mohsen_csharp
دوشنبه 07 اردیبهشت 1388, 09:45 صبح
حالا می خوام کاری کنم که از کلاسم شی نسازم فقط با نامش کار کنم . چطوری این کارو انجام بدم ؟؟؟
در این صورت کلاس رو باید به صورت static تعریف کنی


public static class myClass
{
public static void doSomething()
{
//code here
}
}
و نحوه فراخوانی:

private void Form1_Load(object sender, EventArgs e)
{
myClass.doSomething();
}
در این صورت فقط یک عنصر ایستا از کلاست خواهی داشت و این روش معمولا برای مواردی استفاده می شود که بخواهی یک سری از توابع رو دسته بندی کنی مانند کلاس های math و convert و یا هنگامی که بخواهی از یک سری متغیر سراسری در کل پروژه ات استفاده کنی آنگاه یک کلاس استاتیک در پروژه به صورت بالا تعریف می کنی و متغیر هات رو به صورت استاتیک توش تعریف می کنی.
ولی در حالت عمومی کلاس ها تعریف می شوند تا مانند یک قالب باشد و اشیائ بسیاری را با استفاده از این قالب ها ایجاد کرد و مقادیر فیلدی متفاوت به آن ها انتصاب نمود و رفتار آن ها را بررسی کرد.

esmaeily-hosein
دوشنبه 07 اردیبهشت 1388, 10:37 صبح
public sealed class Utility
{
//way 1
public static readonly Utility StaticInstance = new Utility();

//way 2
public Utility Default
{
get { return new Utility();}
}

public string HelloWorld()
{
return "HelloWorld";
}
}

seven7777777
چهارشنبه 09 اردیبهشت 1388, 06:24 صبح
دوستان من با کمک شما شروع به نوشتن کلاس کردم . الان یه کلاس واسه کاربران نوشتم که کدش در زیر :


class Users
{
private string _code;
private string _fname;
private string _lname;
private bool _sex;
private string _intcode;
private string _username;
private string _password;

public Users()
{
_code = _fname = _lname = _intcode = _username = _password = String.Empty;
_sex = false;
}

public Users(string code)
{
try
{
if (IsExist("Members", "code=" + code))
{
SqlCommand com = new SqlCommand();
com.Connection = New_Connection();
com.CommandText = "SELECT fname,lname,sex,intcode FROM Members WHERE code=@c";
com.Parameters.AddWithValue("@c", code);
SqlDataReader reader = com.ExecuteReader();
reader.Read();
_code = code;
_fname = reader.GetString(0);
_lname = reader.GetString(1);
_sex = reader.GetBoolean(2);
_intcode = reader.GetString(3);
}
}
catch (Exception ex)
{
}
}

public string code
{
get { return _code; }
set { _code = value; }
}
public string fname
{
get { return _fname; }
set { _fname = value; }
}
public string lname
{
get { return _lname; }
set { _lname = value; }
}
public bool sex
{
get { return _sex; }
set { _sex = value; }
}
public string intcode
{
get { return _intcode; }
set { _intcode = value; }
}
public string username
{
get { return _username; }
set { _username = value; }
}
public string password
{
get { return _password; }
set { _password = value; }
}

privatestatic SqlConnection New_Connection()
{
SqlConnection _sqlcon = newSqlConnection();
_sqlcon.ConnectionString = "Data Source=(local);Initial Catalog=Sharif_Res_DB;Integrated Security=True";
_sqlcon.Open();
return _sqlcon;
}

publicbool IsExist(string table, string whcol)
{
SqlCommand com = new SqlCommand();
com.Connection = New_Connection();
com.CommandText = "SELECT COUNT(id) FROM " + table + " WHERE " + whcol;
int num = Convert.ToInt32(com.ExecuteScalar());
com.Connection.Close();
if (num > 0)
return true;
return false;
}

public string New_Percode()
{
string _percode = String.Empty;
SqlCommand com = newSqlCommand();
com.Connection = New_Connection();
com.CommandText = "SELECT MAX(id) FROM Users";
SqlDataReader reader = com.ExecuteReader();
if (reader.Read())
_percode = (reader.GetInt32(0) + 1).ToString();
else
_percode = "10000";
_percode = PersianDate.Now.Year.ToString().Substring(2, 2) + _percode + "000";
reader.Close();
com.Connection.Close();
return _percode;
}

public bool Reg_NewUser()
{
try
{
string subcol = String.Empty;
string subval = String.Empty;
if (!String.IsNullOrEmpty(_intcode))
{
subcol = ",intcode";
subval = ",@i";
}
SqlCommand com = new SqlCommand();
com.Connection = New_Connection();
com.CommandText = "INSERT INTO Users (code,fname,lname,sex" + subcol + ") VALUES (";
com.CommandText += "@c,@f,@l,@s" + subval + ")";
com.Parameters.AddWithValue("@c", _code);
com.Parameters.AddWithValue("@f", _fname);
com.Parameters.AddWithValue("@l", _lname);
com.Parameters.AddWithValue("@s", _sex);
try
{
com.Parameters.AddWithValue("@i", _intcode);
}
catch (Exception ex)
{
}
com.ExecuteNonQuery();
return true;
}
catch
{
return false;
}
}

public static bool Del_User(string code)
{
try
{
SqlCommand com = newSqlCommand();
com.Connection = New_Connection();
com.CommandText = "DELETE FROM Users WHERE code=@c";
com.Parameters.AddWithValue("@c", code);
com.ExecuteNonQuery();
return true;
}
catch (Exception ex)
{
return false;
}
}

public bool Update_User()
{
return true;
}
}

حالا چند سوال :
1. درست نوشتم یعنی قوانین توش رعایت شده ؟
2. به عنوان مثال من فیلد کد ملی کاربر رو در دیتابیس NULL گذاشتم . حالا این که چک کنم که اگه این متغیر در برنامه مقدار نداره یا اگه داره باید در کلاس اعمال بشه یا کلاس باید به شکل کلی نوشته بشه و من این حالت رو در برنامم چک کنم ؟ ( مثلا من اومدم و تو کلاس اینو چک کردم ، در تابع Reg_NewUser())
3. کلا راهی هست که چک کنیم اگه برخی متغیرهای اجباری در فرم مثل نام خالی هستند ، ما بفهمیم یا باید حتما تک تک اونها چک بشن ؟
4. من می خوام کلاس Members رو هم بنویسم که از این کلاس به ارث ببره ، اینم یه توضیح بدین لطفا .


پیشاپیش هم تشکر می کنم