PDA

View Full Version : مزيت كلاس با constructor



maryam82
شنبه 02 خرداد 1388, 12:13 عصر
با سلام و خسته نباشيد خدمت دوستان عزيز

كسي مي تونه باذكر يك مثال مزيت كلاس با سازنده را نسبت به يك كلاس بدون سازنده توضيح بده؟
با تشكر

tdkhakpur
شنبه 02 خرداد 1388, 12:32 عصر
سلام:
ببینید یه سازنده یا constructorمزیت اصلی یه کلاس هست و شاید اگه برای کلاسها طراحی نمیشد تقریبا قدرت اصلی کلاسها از بین می رفت.
ببینید کار اصلی یه سازنده عموما توی برنامه نویسی برای مقداردهی اولیه به متغیرها- بدون نیاز به فراخوانی یک تابع برای مقدار دهی آنهاست.
مثلا شما یه متغیر به شکل زیر در کلاس دارید.


class Task
{

Private:
char Status;

متغیر Status برای ما در برنامه نشان میده که کلاس چه وضعیتی داره ولی همیشه این وضعیت باید پر باشه تا وضعیت کلاس Task بررسی بشه.
برای پر کردن این وضعیت به هنگام ایجاد کلاس چه باید کرد.؟
1 - اینکه یه تابع باید نوشت تا این مقدار رو پر کنه مانند زیر.


void Task::InitStatus(void)
{
Status = 0;
}

این روش کار میکنه ولی باید تابع InitStatusرو در برنامه خودمون صدا بزنیم.که این یه ایراد نیست.
2- ولی بهترین روش ایجاد یه سازنده یا constructo هست که خودش اتوماتیک در حین ایجاد کلاس مقدار دهی اولیه رو هم انجام بده. مثال زیر.



public:
Task(void){
Status = 0;
}

موفق باشید.

pesar irooni
شنبه 02 خرداد 1388, 12:38 عصر
مزیتهای فراوانی داره.
فرض کنید شما به محض ساخته شدن کلاستون قراره یه سری متغیر ها رو مقدار دهی اولیه کنید و یا حتی مقدارشون رو از صداکننده بخونید. برای اینکار وقتی که new میکنیم constructor اجرا میشه و ما هر کاری رو که هنگام شروع کلاس بخواهیم انجام بدیم اون موقع انجام میگیره.
مسلما از کلاسهای زیادی تو C# استفاده کردید. اگه توجه کرده باشید بعضی اونها موقع ای که new میکنیم (یک شی میسازیم) ازتون پارامتر میخواد. این پارامترها رو در اصل برای مقدار دهی متغیرهاش تو کلاس میخواد.
به عنوان یه مثال دیگه شما وقتی یه فرم به پروژه تون اضافه میکنیم و اون رو design میکنید تمام اینها در متد InitializeComponent() بصورت کد در میاند که هر وقت ما اون فرم رو فرابخونیم یا new کنیم این متد تو constructor فراخاونی میشه تا فرم ما رو به شکل دلخواه بهمون نمایش بده.

Unknownlive
شنبه 02 خرداد 1388, 14:08 عصر
بحث تکمیلی : اولا اگه شما ننویسید خود کامپایلر یک سازنده برا کلاس می نویسه که همه متغیر ها را صفر،خالی،تهی،false و ... می کنه دوما برا Struc خودش می نویسه و یک هم بیشتر نمی شه براش نوشت در صورتی که برای کلاس می توان از چند تا استفاده کرد.

esmaeily-hosein
شنبه 02 خرداد 1388, 14:52 عصر
دوما برا Struc خودش می نویسه و یک هم بیشتر نمی شه براش نوشت
این حرف غلط است . برای struct هر چند تا که بخوای میتونی ctor تعریف کنی فقط نمیتونی
Ctor بدون پارامتر تعریف کنی .
Ctor در حقیقت یک متد است که زمانی که شی از کلاست ساخته میشه اونم اجرا میشه حالا تو اون متد میتونی همه کار کنی !
مثلا یک Class ساختی میخوای از اون بیشتر از 3 تا نمونه ساخت یه پیغام بده که این کلاس خریداری نشده :


public class Test
{
private static int iCounter=0;

public Test()
{

if (iCounter>3)
Messagebox.Show("Class Not Registered");

iCounter++;
}
}

mohsen_csharp
شنبه 02 خرداد 1388, 18:59 عصر
اگر از کلاس های استاتیک استفاده نمی کنید ، حتما برای کلاس خود سازنده تعریف کنید حتی اگه هیچ پارامتری نداشته باشه و داخل این سازنده هیچ کدی نوشته نشه.
چون اگه این کار را نکنید اونوقت هیچوقت نمی تونید به اشیایی که از این کلاس ساخته میشن مقدار بدین و همیشه این اشیا null خواهند بود مگه اینکه یک شی دیگر به این شی شما فضای حافضه ای مناسب پاس کند.
شما یک سازنده بدون پارامتر و بدون کد می نویسید تا بتونید با فراخوانی این سازنده ، برای شی خود فضای مورد نیاز رو اختصاص بدید.
شما هنگامی که از کلاس خود یک شی درست می کنید نام این شی در حافضه stack که مخصوص متغیرهای مقداری است، ذخیره میشه ولی وقتی با فراخوانی این سازنده به شی خود فضا اختصاص می دید این فضا در حافضه heap که مخصوص اشیای ارجاعی است،به شی شما اختصاص داده میشود.
توجه داشته باشید که نام شی شما در stack ذخیره شده و شما میتونید چند شی از این کلاس تعریف کنید به صورتی که همه این اشیا به یک حافضه یکسان از heap اشاره کنند. این یکی از مزیت های متغیر های ارجاعی است.

pesar irooni
شنبه 16 خرداد 1388, 17:59 عصر
این فایل رو که برات آپلود میکنم کلا راجع به Constructor و descructor هست. بخونیدش. جالبه
به زبان C++ هست ولی خوب فرقی نداره که...

saeed-kh
شنبه 16 خرداد 1388, 21:30 عصر
در ضمن بوسیله سازنده ما میتونیم Signatureهای متفاوتی برای کلاس بسازیم و هنگام ساخت کلاس از اونا استفاده کنیم.تقریبا همون خاصیت overloadingفکر میکنم