فصل 1
معرفی محل کار آموزی و شناسایی
فعالیتهای تخصصی آن
1-1) معرفی شرکت ایران خودرو خراسان
شرکت ایران خودرو خراسان قسمتال 79 در پی توافقات شرکت ایران خودرو و استانداری خراسان تشکیل شد. با تامین 760 هکتار زمین در جوار شهر جدید در حال احداث بینالود ( با پیش بینی استقرار بیش از یکصد هزار نفر از جمعیت سرریز مشهد و با محوریت اشتغال صنعت خودرو ) در 55 کیلومتری جاده مشهد – نیشابور و در تقاطع خطوط ریلی و جاده ای ( تقاطع خطوط ریلی شمال – جنوب سرخس ، بندرعباس و شرق – غرب مشهد تهران ) فعالیتهای اجرائی در اواخر سال 81 آغاز گردید . کلیه امکانات زیر بنایی ( برق ، گاز ، مخابرات ) در حد مناسب تامین گردیده است. در حدود 600 واحد مسکونی برای استقرار کارکنان شرکت توسط شهر جدید بینالود و مسکن و شهرسازی در دست احداث می باشد.
پروژه با ظرفیت تولید اسمی 100000 دستگاه در سال ( 20 دستگاه در ساعت ) و با زیر بنای 125000 متر مربع ، اشتغال مستقیم 2300 نفر ( غیر مستقیم دهها هزار نفر ) از متخصصین و نیروهای صنعتی – تولیدی را در ظرفیت نهایی در پی خواهد داشت.
سالن مونتاژ با زیر بنای 35000 متر مربع مراحل تست ماشین آلات و تاسیسات را در نیمه ی دوم بهمن ماه 83 با راه اندازی آزمایشی آغاز نمود. (فاز اول ایران خودرو خراسان در تاریخ ششم خردادماه هشتادو چهار با حضورمعاون اول رئیس جمهور ، وزیر صنایع ، استاندار خراسان و تنی چند از مقامات و مسئولان کشوری ، استانی ، نمایندگان مجلس شورای اسلامی و مدیران شرکت ایران خودرو به بهره برداری رسید. ظرفیت خط مونتاژ در دی ماه 84 به 70 دستگاه در روز رسید و تا پایان 84 بالغ بر 100 دستگاه در روز بود .
سالنهای بدنه و رنگ با زیربنای80000 متر مربع در حال احداث و آماده سازی برای نصب ماشین آلات است. مدیریت پیمان احداث تاسیسات به عهده ی شرکت ایران خودرو سازه می باشد و تامین – نصب و راه اندازی ماشین آلات با شرکت تام ایران خودرو است 0
تجهیزات PT/ED خط رنگ از شرکت DURR آلمان خریداری و در مراحل نهایی نصب است و مبتنی بر جدیدترین تکنولوژی رنگ آمیزی در صنایع خودرو سازی ( سیستمRoDIP-3) می باشد
خطوط رنگ و بدنه در نیمه دوم سال 85 آماده راه اندازی خواهند بود .
در دو سال اخیر به طور متوسط روزانه حدود 700 نفر نیروهای پیمانکاری مختلف در سایت فعالیت داشته اند و صدها نفر از پرسنل شرکت ایران خودرو خراسان و دیگر شرکتهای گروه صنعتی ایران خودرو در تهیه ی سیستمها وآموزش نیروی انسانی و امور مهندسی و لجستیک فعالیت داشته اند.
مزیتهای عمده ی پروژه ی ایران خودرو خراسان به شرح ذیل است .
* امکان توسعه ی بازار هدف و صدور محصولات.
* برخورداری از ظرفیت فرهنگ صنعتی خودرو در منطقه و بکارگیری نیروی انسانی با تحصیلات متناسب و مرتبط و ایجاد سازمانی منعطف ، چابک و بهره ور.
* برخورداری از موقعیت ممتاز ارتباطی به جهت واقع شدن در تقاطع خطوط ریلی و جاده ای شرق کشور.
* امکان استفاده از حمایتهای منطقه ای به جهت تکمیل زنجیره تولید خودرو ( با توجه به تولید بیش از 30% قطعات خودرو در منطقه ).
* برخورداری از معافیتهای مالیاتی مناطق محروم.
* الگو برداری از تجارب و شایستگیهای محوری گروه صنعتی ایران خودرو و امکان آموزش فراگیر نیروی انسانی در گروه .
* استقرار مجموعه های قطعه ساز خصوصی در شهرک صنعتی مجاور با هدف ایجاد خوشه صنعتی و تبدیل منطقه به شهرک خودرو.
* استقرار سازمانهای یاد گیرنده با نگرش سیستمی و فرایندی .
* استفاده از گاز برای تامین گرمایش و بهره مندی از کلیه امکانات ارتباطی و دیگر نیازمندیهای اساسی .
* قرار گرفتن در فاصله 50 کیلومتری فرودگاه بین المللی مشهد .
محصولات فاز اول پروژه ، خودروهای پژو پارس و پژو 405 می باشد و تولید محصولات جدید بر اساس ماموریتهای محوله از گروه صنعتی ایران خودرو خواهد بود.
2-1) منابع انسانی
شرکت ایران خودروی خراسان ، توسعه منابع انسانی را سرلوحه همه امور قرار داده و تمام توان خود را در سه محور جذب ، نگه داری و بالندگی منابع انسانی متمرکز کرده و مصمم است با برنامه ریزی و بهره مندی از تجربیات سایر واحدهای صنعتی و بویژه خانواده بزرگ گروه صنعتی ایران خودرو ، گامهای اساسی ، مهم و زیر بنایی را در سه محور فوق برداشته و آینده ای روشن در بکارگیری منابع انسانی کارآمد رقم زند .
در این راستا بر موارد ذیل تاکید شده است :
* شناسایی و تهیه بانک اطلاعاتی نیروهای متخصص ، ماهر و نیمه ماهر
* ایجاد ارتباط دو سویه با مراکز علمی ، دانشگاهی و تحقیقاتی و بهره مندی از فارغ التحصیلان خبره و انتقال دانش و تجربیات در جهت اهداف تعیین شده در شرکت .
* تاکید بر امر آموزش با برنامه ریزی و استفاده از مکانیزمهای نوین آموزشی در جهت افزایش مهارتها و قابلیتهای کارکنان
* ایجاد بسترهای مناسب در جهت نگه داری سرمایه های انسانی با هدف کاهش نرخ خروج نیروهای کیفی و جذب نیروهای کارآمد
* ایجاد زمینه مناسب جهت افزایش امنیت شغلی از طریق نظامهای حمایتی مطلوب
* بهره مندی از تفکر گروهی و اشاعه فرهنگ کار جمعی
* حفظ و صیانت منابع انسانی ، افزایش سلامت روحی و جسمی کارکنان
* توجه به تخصص و تجربه و نگاه ویژه به ارزشهای وجودی کارکنان بر اساس اصل شایسته سالاری
* بهبود و افزایش کیفیت زندگی کارکنان در راستای تعلق خاطر بیشتر شاغلان به شرکت .
3-1) خط مونتاژ
سالن مونتاژ با زیر بنای 35000 متر مربع در تاریخ ششم خردادماه 1384 با حضورمعاون اول رئیس جمهور ، وزیر صنایع ، استاندار خراسان و تنی چند از مقامات و مسئولان کشوری ، استانی ، نمایندگان مجلس شورای اسلامی و مدیران شرکت ایران خودرو به بهره برداری رسید. در سال 84 تعداد تولید به عدد 7000 رسید و در سال 85 نیز 36000 خودرو پارس و 405 به بازار داخلی عرضه گردید. همزمان با افزایش تیراژ تولید ، کیفیت محصولات این شرکت از ابتدا برتری خود را نسبت به خودروهای با ساخت داخل بیش از 80% حفظ نموده است و کماکان پیشتاز کیفیت این گروه از خودرو ها میباشد.
برنامه ریزی گروه صنعتی ایران خودرو بر اینست که این شرکت در سال 86 ، 66000 خودرو تولید و عرضه نماید که با توجه به رویکرد کلان کشور در جهت ترویج و جایگزینی گاز CNG به جای سوخت بنزین ، جایگاه CNG احداث شده و سهم عمده ای از هدف سال 86 به خودروهای دوگانه سوز اختصاص یافته است.
همچنین خط مونتاژ خودرو دو دیفرنسیال گرند ویتارا (محصول 2005 شرکت سوزوکی) در 25 فروردین ماه 86 با حضور معاون اول رییس جمهور ، استاندار خراسان و تنی چند از مقامات و مسئولان کشوری ، استانی ، نمایندگان مجلس شورای اسلامی و مدیران شرکت ایران خودرو به بهره برداری رسید و تولید 6000 خودرو در خط مذکور برای سال 86 برنامه ریزی شده است.
سالن تکمیلکاری با مساحت 8500 متر مربع به منظور تنظیمات و کنترلهای نهایی محصول مورد استفاده قرار خواهد گرفت . عملیات ساختمانی این سالن در حال اتمام است و تا زمان راه اندازی کامل سالن ، فعالیتهای تکمیلکاری در بخشی از سالن مونتاژ در حال انجام است.
4-1) تامین و لجستیک
قطعات و مجموعه های مورد نیاز تولید این شرکت توسط شرکت ایران خودرو و ساپکو و با سعی و تلاش قطعه سازان تامین و به محل سایت ایران خودرو خراسان منتقل میگردد .
پروژه های تامین و لجستیک با هدف تدوین برنامه های جامع شرکت IKK در جهت پوشش کامل نیازهای یک بنگاه اقتصادی صنعتی با ساختار و سیستم منسجم و چابک در حد استانداردها و شاخصهای رقابت پذیر و تولید ناب بشرح ذیل در دست اقدام میباشد.
* استفاده حداکثر از تکنولوژی IT در پروسه های تامین و لجستیک
* پیاده سازی نرم افزار SAP ؛ سیستم های یکپارچه برنامه ریزی ،انبار، سفارشات و تغذیه خطوط، کنترل موجودی و پروسه های ردیابی( ERP)
* ایجاد پارک تامین و استقرار قطعه سازان در کنار سایت ایران خودرو خراسان از جمله اهداف استراتژیک ایران خودرو خراسان میباشد که تسهیلات و امکانات لازم برای تحقق این مهم را فراهم نموده و برنامه ریزی شده است و بخش قابل ملاحظه ای از این طرح در نیمه اول سال جاری به بهره برداری برسد .
* ایجاد تسهیلات مناسب به منظور استقرار سازندگان قطعات حجیم (گروه(A در فاصله 50 تا 60 کیلومتری کارخانه
* لجستیک کانبان : سفارشات بروز ،تحت وب،به اندازه و…
* مدیریت پیمان و برون سپاری در تامین و لجستیک :از تامین تا تغذیه خط
* کاهش پروسه های انبار و به حد اقل رساندن حجم انبارداری
* گمرک: استقرار گمرک قسمتایت خراسان
* توسعه حمل ریلی
5-1) پروژههای شرکت
1-5-1) پروژه تولید بدنه
سالن بدنه سازی سالن بدنه سازی ایران خودرو خراسان با وسعت بالغ بر24000 متر مربع و با هدف تولید انواع خودروهای سواری ،SUV ، VAN و … احداث گردید. عملیات اجرایی احداث خط تولید و اجرای عملیاتی تاسیساتی از اواخر سال 84 شروع و ظرف مدت 15 ماه آماده تولید انبوه میباشد.
مسئولیت طراحی،ساخت، نصب و راه اندازی خط SUV با نظارت مرکز مهندسی ایران خودرو بعهده شرکت تام بوده است.
کلیه گانهای جوشکاری و تجهیزات خط تولید توسط سازندگان داخلی طراحی و ساخته شده است. جیگهای اصلی از شرکت ژاپنی تامین شده و با اعمال تغییراتی افزایش ظرفیت آن در دست اقدام است. خط بدنه گرند ویتارا NGV از ابتدای سال 86 آماده تولید انبوه است .
2-5-1) پروژه خط رنگ
رنگ اصلی :
سالن رنگ ایران خودروخراسان با هدف تولید 27 دستگاه بدنه در ساعت طراحی و در دو فاز پیش رنگ و رنگ نهایی اجراء میگردد . فاز اول (سالن پیش رنگ) در اسفند 85 به بهره برداری رسیده و فاز دوم (رنگ نهایی) در آذر ماه سال 86 به بهره برداری خواهد رسید .
این سالن در زیربنای حدود 34.000 مترمربع احداث و تجهیزات خط شامل خط رنگ آمیزی PT&ED (تجهیزات مدرن RO-DIP3) ، خط سیلر و پی وی سی ، خط رنگ آمیزی پرایمر؛ خط رنگ آمیزی رویه و سیستمهای تامین برق اضطراری ، آب دیونیزه ، سیستمهای سرمایش و گرمایش میباشد.
خطوط رنگ آمیزی توسط شرکت DURR آلمان طراحی و بخش عمده تجهیزات توسط سازندگان داخلی ساخته شده و توسط شرکت تام ایران خودرو نصب و راه اندازی گردیده است .
رنگ نهایی با ظرفیت 25 خودرو در ساعت توانایی رنگ آمیزی ده رنگ متالیک و چهار رنگ سالید را دارد.
سالن رنگ ویژه :
سالن رنگ ویژه با هدف رنگ آمیزی خودروهای ویژه (SUV) با وسعت 2100 مترمربع توسط متخصصان داخلی طراحی و با ظرفیت دو دستگاه در ساعت خودرو و رنگ آمیزی قطعات پلیمری ساخته و نصب شده و در مرحله راه اندازی میباشد .
3-5-1) پروژه سایت و تاسیسات زیر بنایی
اراضی : سایت 760 هکتاری ایران خودرو خراسان حد فاصل بزرگراه مشهد ـ نیشابور در شمال و راه آهن مشهد ـ تهران در جنوب کلا تملک و محصور شده است .
محوطه سازی : محوطه سازی و آسفالت معابر و پارکینگ محصول در حد نیاز انجام شده و آماده سازی بقیه خیابانها در دستور کار است .
ساختمانهای جانبی : ساختمانهای مدیریت ، تحویل کالا ، انبار غیر تولیدی ، فروش ، پست پاساژ ، کمپرسورخانه ، دیزل اضطراری ، پست و موتورخانه تزئینات ، آدیت محصول ، آشپزخانه ، نگهبانی و حراست فیزیکی احداث و ساختمانهای انبارهای تولیدی و غیر تولیدی ، PDI و کارواش و … در برنامه ساخت آتی شرکت میباشد .
فضای سبز:ایجاد110هکتارفضای سبز با استفاده از انواع گونه های درختی انجام شده است.راه آهن : ارتباط ریلی از محل ایستگاه ابومسلم به جنوب سایت ایجاد و امکان تخلیه و بارگیری همزمان از سه ریل در سکوی راه آهن پیش بینی شده است.
آب : در حال حاضر 3 حلقه چاه با آبدهی 35 لیتر در ثانیه تجهیز گردیده است . احداث مخازن آب 4000 متر مکعبی ، پمپ خانه آب ، اجرای کانالهای تاسیساتی آدم رو به طول 2500 متر ، احداث شبکه های آب شرب ، بهداشتی ، صنعتی ، آتش نشانی و آب بازیافت از جمله اقداماتی است که در این رابطه انجام و در حال بهره برداری می باشد.
برق : در حال حاضر برای تامین 7 مگاوات برق امکانات لازم مهیا گردیده و با اجرای پروژه احداث پست 20/132 کیلو ولت ، الباقی نیاز سایت بطور کامل برطرف شده و از ابتدای سال آینده به بهره برداری خواهد رسید .
برق اضطراری : 3 دستگاه دیزل ژنراتور اضطراری 1150 کیلو ولت آمپر ، تامین کننده برق اضطراری مورد نیاز میباشد .
گاز : ایستگاه گاز C.G.S به ظرفیت 10000 متر مکعب در ساعت و شبکه های گاز محوطه و لوله کشی گاز سالنهای تولیدی و ساختمان های جانبی تماما اجراء و در حال بهره برداری است .
سوخت : مخازن و پمپ بنزین جهت تامین سوخت مورد نیاز خودروها در سالن تزئینات و پمپ گازوئیل جهت تامین سوخت خودروهای لجستیکی و سوخت جایگزین احداث گردیده است .
مخابرات و دیتا : مرکز مخابرات 2000 شماره ای شهر جدید بینالود نصب گردیده و امکان برقراری 200 خط مستقیم فراهم شده است . در فاز یک ، مرکز مخابرات 500 شماره ای سایت نصب و در حال بهره برداری می باشد . ارتباط دیتا با پهنای باند 8 مگا بیت در مرکز بینالود ایجاد و با تصب دیش اختصاصی ، امکانات لازم برای توسعه ارتباط دیتا فراهم گردیده است .
هوای فشرده : 2 دستگاه کمپرسور سانتریفیوژ ، هر یک به ظرفیت 63 متر مکعب در ساعت و 1 دستگاه کمپرسور 20 متر مکعب در ساعت نصب و در حال بهره برداری می باشد .
تصفیه خانه آب : سیستم تصفیه خانه آب RO در مرحله ساخت و نصب میباشد .
تصفیه خانه های فاضلاب شیمیایی و بهداشتی : مطالعات لازم انجام و در مرحله انتخاب پیمانکار میباشد .
4-5-1) پروژه تولید خودروSUV گرند ویتارا
استقبال بیش از حد جوانان از خودروهای SUV ( Sport Utility Vehicle ) ، شرایط جوی و جغرافیایی کشور ، همچنین ایجاد تنوع محصول و افزایش سهم بازار باعث گردید تا طرح اضافه شدن یک خودرو از کلاس SUV به سبد محصولات ایران خودرو ، در استراتژی این شرکت منظور گردد .
پس از بررسی خودرو های دو دیفرانسیل روز دنیا ، خودروی Suzuki New Grand Vitara ( NGV ) محصول سال 2005 شرکت سوزوکی ژاپن به عنوان خودروی منتخب برگزیده شد. این خودرو توانسته بود با تکیه بر تکنولوژی ناب ژاپنی در اولین سال ورود خویش به بازارهای جهانی ، به فروش بیش از دو میلیون دستگاه در سال دست پیدا کند.
بهره گیری از تکنولوژی روز دنیا و تجهیزات مدرن اعم از ، سیستم تهویه هوای اتوماتیک ، سیستم ایمنی ضد سرقت ، صفحه نمایشگر اطلاعات خودرو ، سیستم الکترونیکی فعال دنده ، استاندارد آلایندگی یورو چهار ، کیسه های ایمنی هوا ، سیستم ترمز ضد قفل ( ABS ) ، سیستم الکترونیکی توزیع نیروی ترمز ( EBD ) ، از امتیازات این خودرو نسبت به خودروهای هم کلاس خود می باشد . موتور 4 سیلندر و 16 سوپاپ این خودرو با حجم cc 2000 ، قدرتی معادل hp 132 را تولید می نماید و این در حالیست که مصرف سوخت آن تنها 6/7 لیتر در هر 100 کیلومتر می باشد.
ایران خودرو برای تولید این محصول تاییدیه های سازمان بهینه سازی مصرف سوخت ، سازمان محیط زیست ، وزارت صنایع و معادن و وزارت بازرگانی را کسب نموده و احداث خطوط تولیدی این خودرو ( خطوط بدنه سازی ، رنگ و مونتاژ ) در ایران خودروی خراسان مراحل پایانی خود را طی می کند . بر اساس برنامه ریزی های به عمل آمده این خودرو از مهر ماه سال جاری به تولید خواهد رسید و به بازار عرضه میگردد .
در راستای طرح رضایت مشتری ، سعی گردیده با تجهیز نمایندگی های مجاز برای ارائه خدمات پس از فروش و همچنین آموزش نیروهای متخصص ، شرایط ایده آلی برای استفاده کنندگان این خودرو فراهم گردد.
5-5-1) پروژه مترو ( قطار شهری )
پیرو تفاهمنامه بین استانداری خراسان ، سازمان گسترش و نوسازی صنایع ایران و گروه صنعتی ایران خودرو و شرکت قطار شهری ، توافق بر پیگیری راه اندازی خط مونتاژ واگنهای قطارشهری مشهد به عمل آمد.
همجواری در کنار خطوط ریلی و پتانسیل فنی و اجرایی مجموعه گروه صنعتی ایران خودرو و ضرورت همراهی همه دست اندرکاران در راه اندازی پروژه مترو مشهد به عنوان دومین کلان شهر مذهبی دنیا ، باعث گردید تا ایران خودرو خراسان به عنوان بازوی فنی و عملیاتی این طرح در بحث انتقال دانش فنی و مراحل اجرایی ، در این طرح بزرگ ملی انتخاب گردد .
6-5-1) پروژه خط تولید خودرو دوگانه سوز
خط مونتاژ ایران خودرو خراسان تا پایان سال جاری قابلیت تولید خودروهای دوگانه سوز کارخانه ای را خواهد داشت .
پروژه احداث مجتمع تعمیرگاه مرکزی و ایجاد جایگاه سوخت CNG
با توجه به ورود صنایع خودرو سازی ایران به مرحله مشتری مداری ، شرکت ایران خودرو خراسان تکریم ارباب رجوع ، جلب رضایت مشتری و ایجاد وفاداری در مشتریان را از اهم وظایف و اهداف خود تعریف نموده است .
در این راستا ، طرح احداث مجتمع بزرگ شامل :
1. سازمان فروش و خدمات پس از فروش شرق کشور و تعمیرگاه مرکزی منطبق با استاندارهای روز جهان
2. نمایشگاه مرکزی جهت ارائه اطلاعات بیشتر در مورد آپشنهای خودرو به مشتری
3. انبار مرکزی توزیع قطعات یدکی استاندارد جهت سهولت تامین قطعه در منطقه و گسترش خدمات پس از فروش
4. تاسیسات مناسب گازسوز نمودن خودرو ها
5. جایگاه سوخت گاز CNG با همکاری سازمان حفاظت محیط زیست .
6. کیفیت در ایران خودرو خراسان
6-1) فعالیتها و مزیتهای کیفی
* استقرار سیستمهای خود کنترلی مطابق آخرین استاندارد پژو سیتروئن
* آزمون و سنجش روزانه قابلیت تجهیزات
* بهره گیری از تجهیزات توانا و کالیبره
* برقراری آموزشهای تخصصی کیفی
* بهره گیری از ابزارهای نوین کیفی
* استفاده از تجارب برترکیفی ایران خودرو
7-1) نتایج و دستاوردهای کیفی IKK
* ارتقاء 20% سطح اهداف کیفی
* دستیابی به رتبه برترین تولید کننده خودرو خوب سطح محصولات ایران خودرو
گروه
رتبه
نام محصول
سطح کیفی نهایی محصول
گروه سواری
نیسان ماکسیما
81.3
مزدا323
93.9
زانتیا سیتروئن
96.3
پژو 206
101.2
پاجرو
105.3
نیسان رونیز
105.8
هیوندایی اونته
116.5
ریو
125.1
هیوندایی ورنا
125.5
فولکس گل
129.3
پژو 405 خراسان
246.4
پژو پارس
252.7
سمند
256.9
پژو 405
292.8
پراید
327.3
پراید پارس خودرو
340
پژو RD
391.7
پراید 141 پارس خودرو
401.3
پی کی جدید
576.5
جدول نتایج سطح کیفیت خودرو های تولیدی در اردیبهشت ماه 1385توسط
شرکت بازرسی کیفیت و استاندارد ایران
8-1) استراتژی شرکت
رسالت وجودی ایران خودرو خراسان
بنگاه اقتصادی با محوریت فعالیت در صنعت حمل و نقل، به منظور جلب رضایت و اعتماد ذینفعان، از طریق ایجاد سازمان یادگیرنده و چابک در حد شاخص ها و استانداردهای روز خودروسازان(متوسط به بالا) جهانی و واحد الگو در بهبود و تقویت زنجیره ارزش در گروه صنعتی ایران خودرو
9-1) چشم انداز ایران خودرو خراسان
سازمانی متعالی و پیشتاز در کیفیت (در گروه تولیدات داخلی مشابه)، بهره وری و توسعه پایدار، هم راستا با استراتژی های گروه صنعتی ایران خودرو با قابلیت رقابت پذیری در صنعت حمل و نقل در بازارهای نوظهور صادراتی
ارزشهای ایران خودرو خراسان
* احترام به مشتریان و خواسته های آنان
* احترام به کارکنان، تعهد به پرورش استعدادها، اعتقاد به اصل هم افزایی و رعایت شایسته سالاری
* احترام به شرکا و تامین کنندگان و رعایت اصل انصاف برای حفظ منافع ذینفعان
* توجه به کیفیت و فرهنگ برتری و تعالی
* حفاظت محیط زیست و ادای حقوق شهروندی
* رعایت اصل تقوی محوری در برخورد با ارزش های ملی و بین المللی
* رعایت اصل رقابت پذیری در بازارهای ملی و بین المللی
فصل 2
فعالیتهای انجام شده و مسئولیتهای
که بر عهده داشتهام
با توجه به جایگاه مناسب شرکت از لحاظ تولید نرمافزار و استفاده مناسب از کارآموزان در راستای هدف ارتباط صنعت با دانشگاه، وظیفه طراحی نرمافزار جامع اطلاعاتی پرسنل خدماتی بر عهده من بود.بنا به درخواست مسئولین مربوطه برنامه فوق باید با قابلیتهای ویژهای همچون قابلیت اجرا بر روی شبکه، طراحی با C#، گزارش گیریهای کامل و تهیه چارتهای لازم و … طراحی میگردید. با توجه به اینکه طراحی نرمافزار باید اصولی میبود لذا متد RUP را در طراحی نرمافزار انتخاب کردم که با استقبال مسئول کارآموزی و همچنین واحد طرح و برنامه مواجه شدم. البته با توجه به کمبود وقت سعی کردم تا سریعتر به مرحله طراحی و تولید نرمافزار بپردازم. در راستای تولید نرم افزار فوق خلاصه فعالیتهای زیر انجام شد که شرح این فعالیتها در فصل بعد آمده است.
* برگزاری چندین جلسه با مسئول کارآموزی جهت روشن شدن برنامه درخواستی.
* آشنایی با قوانین شرکت و قوانینی که باید در طراحی نرم افزار در نظر گرفته میشد.
* برگزاری جلسه با مسئولین طرح و برنامه جهت مشخص نمودن سازگاری برنامه با شبکه و گرفتن مشاورههای لازم جهت رفع مشکلات احتمالی آتی نرم افزار.
* مشخص کردن ورودیها و خروجیهای نرم افزار مذکور.
* تهیه Document برای مسئول کارآموزی و واحد طرح و برنامه و رفع اشکالات در طراحی برنامه.
* طراحی Use Case Diagram از برنامه مورد تقاضای شرکت.
* طراحی فرمهای اولیه برنامه و مشخص کردن نحوه ورود اطلاعات در برنامه و خروجیهای درخواست شده در برنامه.
* بررسی فرمهای اولیه با مسئول مربوطه و واحد طرح و برنامه و رفع اشکالات و کاستیهای احتمالی در همان ابتدای طراحی نرم افزار.
* بررسی و انتخاب نوع بانکها، نوع برنامه، نوع پلتفرم، و کمک گرفتن از واحد طرح و برنامه جهت سازگار کردن برنامه با سیستم و برنامههای موجود در شرکت.
* مطالعه بانکهای اطلاعاتی Access و بررسی مزایا و معایب آن و نحوه بهینه کردن استفاده از این بانکها.
* مطالعه بر روی برنامههای تحت شبکه و نحوه طراحی آنها با C#.Net و بررسی محدودیتها و ارائه راه کارهای مناسب جهت اجرای مناسب و بهینه برنامه بر روی شبکه.
* مطالعه دستورات SQL مورد نیاز . نحوه و مکان مناسب بکارگیری این دستورات.
* مطالعه مفاهیم شئگرایی در C# و نحوه پیاده سازی این مفاهیم.
* بررسی الگوریتمهای مورد نیاز و ارائه راهکار مناسب و بهینه جهت پیاده سازی این الگوریتمها.
* بررسی توابع و کلاسهای مورد نیاز برنامه و مشخص کردن ورودیها و خروجیهای هر تابع.
* کد نویسی مناسب برای هر تابع و کلاس همراه با کامنت گذاری مناسب جهت مشخص نمودن ورودیها و خروجیها و کار هر تابع.
* استفاده مناسب از امکانات .NET 2 همچون Validator ها در طراحی برنامه.
* ایجاد کدهای مناسب برای ورود، ویرایش و حذف اطلاعات در قسمتهای مختلف برنامه.
* ایجاد Eventها و پیغامهای مناسب جهت جلوگیری از سردرگمی کاربر و راحت شدن کار کاربر.
فصل 3
شرح کامل فعالیتهای
انجام شده
با توجه به بزرگ بودن شرکت و اهمیت مدیریت منابع و از طرف دیگر وابستگی مدیریت به گزارش گیری مناسب و نرم افزارهای مناسب جهت گزارش گیری و همچنین جایگاه ممتاز شرکت در زمینه IT و حساسیت موضوع، در چند روز اول مسئول کارآموزی سعی کرد تا کارهایی که باید انجام دهیم را مشخص نمایید. در این راستا وی با صبر و شکیبایی با برگزاری جلسات متعدد و موظف کردن کارمندان در جواب به سئوالاتم نسبت به آشنایی با محیط و مشخص شدن کارهایی که باید انجام دهم اقدام نمود.
برنامهای را که من باید طراحی میکردم برنامه جامع بانک اطلاعاتی پرسنل خدماتی شرکت بود. با برگزاری چند جلسه با مسئول کارآموزی ورودیها و خروجیهای برنامه مشخص شد. چون حساسیت کار زیاد بود و کار باید اصولی انجام میشد، متد RUP را در طراحی نرمافزار برگزیدم و نسبت به تهیه Use Case Diagram اقدام نمودم. البته با توجه به اینکه این دیاگرامها زیاد برای اشخاص مختلف قابل فهم نبود، لذا نسبت به ایجاد یک Document از ورودیها و خروجیهای برنامه اقدام نمودم که آنرا در پیوست گزارش آوردهام.
پس از نشان دادن Document مربوطه به مسئول کارآموزی و مشخص کردن کاستی ها و مشکلات آن، نسبت به ارائه Document فوق به واحد طرح و برنامه اقدام نمودم و آنها نیز نظرات و راهنمائیهای خود را در جهت رفع مشکلات احتمالای برنامه و سازگار کردن برنامه با سیستم موجود در شرکت ارائه دادند.
پس از این مرحله شروع به طراحی فرمهای اولیه نمودم و منوها و فرمهای ورود اطلاعات را طراحی نمودم. همچنین فرم اولیه انواع جستجو و گزارش را مشخص کردم و در منوها نیز این امر را لحاظ نمودم.
پس از این مرحله طی جلسهای پیشرفت کار را به مسئول کارآموزی ارائه دادم و ایشان نیز نقاط ضعف و قوت کار را به من نشان دادند. سپس فرم های طراحی شده اولیه را به واحد طرح و برنامه ارائه دادم و آنها نیز با ارائه اشکالات برنامه مرا در طراحی نرمافزار فوق یاری کردند.
با توجه به اینکه برنامه باید برروی شبکه اجرا میشد و بانکهای اطلاعاتی بر روی سرور قرار میگرفت، طراحی برنامه با مشکلاتی همراه بود. لذا در طراحی برنامه و کد نویسی بیشتر سعی کردم تا از راهکارهایی استفاده کنم تا کمترین میزان ترافیک در شبکه را ایجاد کند. لذا در طراحی برنامه بجای استفاده از بعضی امکانات موجود در .NET مجبور به کد نویسی شدم. برای مثال در فرم نظرسنجی باید اطلاعات شخص انتخاب شده در فرم قبل نمایش داده میشد. اگر از ویزاردهای .NET استفاده میکردم کلیه اطلاعات تمام پرسنل در برنامه لود میشد و سپس اطلاعات مورد نیاز فیلتر میشد و نمایش داده میشد که این قضیه باعث افزایش درخواست از سرور و افزایش ترافیک شبکه و کاهش سرعت اجرای برنامه میشد. این مشکل با استفاده از دستورات SQL مناسب حل شد و تنها اطلاعات مربوط به همان شخص از سرور درخواست شده و نمایش داده میشد.
چون این برنامه اولین برنامهای بود که با C# طراحی میکردم، لذا مجبور به استفاده از کتابها و جزواتی در مورد مفاهیم شئیگرایی و اصول برنامه نویسی در C# شدم. که شرح بعضی از مطالب آموخته شده و مورد نیاز در فصل بعد آمده است.
از قابلیتهای برنامه طراحی شده میتوان به موارد زیر اشاره نمود:
برنامه تحت شبکه است.
برروی پلتفرم .NET 2 طراحی گردیده.
در طراحی آن سعی شده تا از کدهای استاندارد و دور از ابهام استفاده شود.
کلیه توابع و کلاسهای مهم برنامه کامنت گذاری گردیده است.
در طراحی گزارشها از ASP.NET استفاده شده است.
بانکهای اطلاعاتی از نوع Access است.
برنامه دیگری نیز جهت امور رفاه پرسنل (تشریفات) در قسمت سفرها و ماموریتها نیاز به تهیه بود که با توجه به کمبود وقت تنها در مرحله آنالیز باقی ماند.
البته نرم افزار بانک جامع اطلاعاتی پرسنل نیز در مدت کارآموزی من تمام نشد ولی با توجه به صحبتهای انجام شده قرار شد برنامه مذکور خارج از وقت اداری در طی دو فاز تکمیل و به شرکت تحویل داده شود.آآآآااا
فصل 4
شرح مطالب و علوم
آموخته شده
1-3) مفاهیم تکنولوژی Net.
مقدمه
C# یکی از زبانهای جدید برنامه سازی شی گرا است که با ارائه رهیافت Component-Based به طراحی و توسعه نرم افزار می پردازد. آنچه ما در حال حاضر از زبانهای برنامه سازی Component-Based در اختیار داریم و آنچه که C# در اختیار ما قرار می دهد، افق جدیدی به سوی تولید و طراحی نرم افزارهای پیشرفته را در روی ما قرار می دهند.
نرم افزار، به عنوان یک سرویس، هدف اصلی نسل بعدی در سیستم های محاسباتی است. برای مثال، C# زبانی مناسب برای تولید و طراحی صفحات وب، ایجاد اجزایی با قابلیت استفاده مجدد و ایجاد محیط هایی چند رسانه ای را به عنوان زبانی که هدفش توسعه ایجاد نرم افزار های پیشرفته است، در اختیار ما قرار می دهد.
زبان برنامه سازی C#، به همراه تکنولوژی جدید شرکت نرم افزاری مایکروسافت یعنی.Net ارائه گردید، از این رو از تکنولوژی .Net این شرکت بهره می برد. پس در ابتدا به بیان مطالبی درباره محیط .Net می پردازیم.
چرا .Net؟
در گذشته زبانهای برنامه سازی، سیستم های عامل و محیط های اجرایی نرم افزار ها برای دوره ای خاص ساخته می شدند. هنگامیکه برنامه ها از محیط های رومیزی(Desktop) به اینترنت منتقل می شدند، ابزارهای موجود نیازمند API هایی اضافی و قابلیتهای دیگری بودند. بیشتر این قابلیتها در کنار زبانهای برنامه سازی بعنوان ابزارهایی جهت رفع این نیازمندیها ارائه می شدند. هرچند این ابزارهای اضافی بصورت قابل توجهی نیازمندیها را حل کرده و باعث رسیدن اینترنت به وضعیت کنونی شدند، اما همچنان مسائل بسیاری وجود داشت که نیاز به حل شدن داشتند.
.Net به منظور پشتیبانی از کاربردهای عصر جدید اینترنت ساخته شد. مواردی همچون گسترش، امنیت و versioning، که از مسایل مهممی بودند، توسط .Net پوشش داده شدند. قسمت مرکزی .Net بخش CLR (Common Language Runtime) است که یک موتور اجرایی مجازی است که از توسعه، امنیت و ارتقای نسخه کد پشتیبانی می نماید. در گذشته چنین امکاناتی برای کدهای کامپایل شده فراهم نبود. بدلیل اینکه .Net توانست بر این مشکلات اساسی فائق آید، راه حل قدرتمندتری جهت ساخت برنامه های تحت اینترنت به شمار می رود.
.Net چیست؟
.Net محیطی جهت ساخت برنامه های توزیع شده است که شامل ابزارهایی نظیر ""کتابخانه کلاسهای پایه"(BCL : Base Class Library)، CLR و زبانهای برنامه نویسی است. این ابزارها امکان ساخت انواع مختلفی از نرم افزارها، از قبیل فرمهای ویندوز، ADO.Net، ASP.Net و سرویسهای وب، را فراهم می آورند.
فرمهای ویندوز، مجموعه ای از کتابخانه ها جهت ساخت رابط های کاربر گرافیکی برای برنامه های کاربردی است. این کتابخانه ها اغلب API های Win32 را در خود دارا می باشند. همچنین امکان استفاده از رهیافت شی گرایی را جهت تولید آسان برنامه های تحت ویندوز، فراهم می آورند.
ADO.Net مجموعه ای از کلاسهای شی گرایی است که جهت ساخت مولفه های داده و سطوح دسترسی داده در برنامه های n-tiered مورد استفاده قرار می گیرد.
ASP.Net شامل مدل برنامه نویسی فرمهای وب است که بوسیله آن برنامه های تحت وب ساخته شده و تحت اینترنت قابلیت اجرا پیدا کرده و از طریق مرورگر(Browser) قابل دسترسی می باشند. این روش مدل بهبود یافته برنامه سازی وب است که در آن کدها در سرور کامپایل می شوند ولی همانند صفحات HTML در کامپیوتر مشتری اجرا می شوند.
سرویسهای وب، رهیافتی جدید، مستقل از platform و استاندار، جهت ایجاد ارتباط و فعالیت بین سیستمهای ناهمگون در اینترنت، می باشند. سرویسهای وب .Net، از زیر ساخت شی گرایی برنامه نویسی ASP.Net استفاده می کنند، اما همچنان از استانداردهای باز و مدلی بر پایه پیغام(Message Based Model) استفاده می نمایند. استفاده از استانداردهای باز از قبیل XML، WSDL و UDDI باعث می شوند تا سرویسهای وب با سایر سرویسهای وب استاندارد که پیاده سازی هایی متفاوت دارند، بدون توجه به محیط و platform آنها، ارتباط برقرار نمایند.
این چند نمونه، اندکی از انواع مختلف نرم افزارهایی بودند که می توان تحت .Net به پیاده سازی آنها پرداخت.
کتابخانه های کلاس های پایه(Base Class Library : BCL)
BCL در .Net، شامل هزاران نوع قابل استفاده، جهت افزایش بهره وری در ساخت برنامه های .Net است. به علت گستردگی BCL یادگیری تمام کلاسهای آن وقت گیر بوده و امکان پذیر نمی باشد، به همین دلیل برای صرفه جویی در زمان بهتر است قبل از ایجاد یک نوع خاص به جستجوی نوع های موجود در BCL بپردازیم. نگاهی کلی به BCL می تواند بسیار سودمند باشد. جدول زیر Namespace های مهم و توضیح نوعهای مختلف BCL را نمایش می دهد.
.NET Namespaces
Namespace
Description
System
The most commonly used types.
System.CodeDom
Allows creating types that automate working with source code, that is, compilers and code creation tools.
System.Collections
Collection types such as ArrayList, Hashtable, and Stack.
System.ComponentModel
Supports building reusable components.
System.Configuration
Types for working with various kinds of XML configuration files.
System.Data
Most of the types for ADO.NET database programming. Other types are in namespaces that are specific to a database or data interface.
System.Diagnostics
Process, EventLog, and Performance Counter types.
System.DirectoryServices
Managed interface for accessing Windows Active Directory Services.
System.Drawing
GDI+ types.
System.EnterpriseServices
COM+ types.
System.Globalization
Types for culture-specific support of calendars, formatting, and languages.
System.IO
Directory, File, and Stream types.
System.Management
APIs for performing WMI tasks.
System.Messaging
Types for working with message queues.
System.Net
Access to networking protocol types.
System.Reflection
Reflection APIs for inspecting assembly metadata.
System.Resources
Types for culture-specific resource management.
System.Runtime
COM Interop, Remoting, and Serialization support.
System.Security
Code access security, role-based security, and cryptography types.
System.ServiceProcess
Types for building Windows Services.
System.Text
Text encoding/decoding, byte array from/to string translation, the StringBuilder class, and regular expressions.
System.Timers
Timer types.
System.Threading
Threads and synchronization types.
System.Web
HTTP Communications, ASP.NET, and Web Services types.
System.Windows
Windows Forms types.
System.XML
All XML support types, including XML Schema, XmlTextReaders/XmlTextWriters, XPath, XML Serialization, and XSLT.
جدول 1-4 Namespaceهای مهم و رایج
هر Namespace مجموعه ای از کلاسهای از پیس ساخته شده .Net است که می توان از آنها در برنامه های مختلف استفاده نمود.
(Common Language Runtime)CLR
CLR یک موتور اجرایی است که با هدف اصلی اجرای هدایت شده کدها در .Net ایجاد گردیده است. CLR به مدیریت اجرا، ارتقای نسخه و امنیت تمامی کدها در .Net می پردازد. به همین دلیل کدهای .Net یا C# اغلب تحت عنوان کدهای مدیریت شده، شناخته می شوند.(Managed Code) تمامی کدهایی که به CLR مرتبت هستند، تحت عنوان "مدیریت شده" و کدهایی توسط CLR مدیریت نشده اند، بلکه مستقیماً به کد ماشین تبدیل می شوند، تحت عنوان "مدیریت نشده" بیان می شوند.
کدهای مدیریت شده، به کد ماشین کامپایل نمی شوند، بلکه به زبان سطح میانی مایکروسافت(MSIL) کامپایل شده و مورد استفاده قرار می گیرند. این زبان سطح میانی را می توان زبانی شبیه به زبان اسمبلی تصور کرد. IL در حافظه بارگذاری می شود و بلافاصله بوسیله CLR در حافظه به کد ماشین کامپایل می گردد.
برنامه های .Net از اسمبلی هایی تشکیل شده اند که اجزای خودکار منطقی توسعه، شناسایی و امنیت به حساب می آیند و تفاوت آنها با روشهای قدیمی در آن است که اسمبلی می تواند شامل یک یا چندین فایل باشد. اسمبلی .Net به صورت یک فایل اجرایی تک یا یک فایل کتابخانه ای است، اما ممکن است حاوی ماژول ها، که کدهایی غیر اجرایی بوده و قابلیت استفاده مجدد را دارند، نیز باشد.
مسئله مهم دیگر در مورد CLR، نحوه بارگذاری(Load) و اجرای برنامه توسط آن است. به محض اینکه برنامه .Net شروع به اجرا می کند، ویندوز اسمبلی .Net راتشخیص داده و CLR را اجرا می کند. سپس CLR نقطه شروع برنامه را شناسایی و پروسه تعیین انواع که در آن، محل قرارگیری انواع مختلف بکار رفته در برنامه مشخص می شود را، اجرا می کند. اسمبلی شناسایی شده در پروسه Loader بارگذاری می گردد.
شکل 1-1 نحوه مدیریت برنامه ها توسط CLR
زبانهای برنامه نویسی
قسمت مهم دیگر .Net، پشتیبانی آن از چندین زبان برنامه نویسی متفاوت است. IL طوری طراحی شده است که از چندین زبان برنامه نویسی پشتیبانی نماید. در حقیقت، هم اکنون ده ها زبان برنامه نویسی مورد پشتیبانی و پذیرش IL می باشند. علاوه بر C#، .Net شامل زبانهایی نظیر Visual Basic، Jscript، J# و C++ نیز می باشد. برخی دیگر از زبانهای برنامه سازی مهم که بوسیله IL پشتیبانی می شوند عبارتند از : BorlandDelphi.Net،Cobol.Net،Fujitsu python.Net، Perl.Net و بسیاری دیگر از زبانهای برنامه سازی که تحت .Net عمل می کنند و بوسیله آن مورد پذیرش هستند.
عامل اصلی نگهدارنده این زبانها در کنار یکدیگر، (Common Types System)CTS است. اگرچه هر یک از این زبانها نوع های خود را در روشهای خاص خود ارائه می دهند، رفتار زیرساختی هر یک از آنها نسبت به CLR یکسان است. CTS اعضای یک نوع را مشخص می نماید : فیلد، متد، رخداد، ویژگی(Property) و اندیکسر(Indexer). همچنین سطوح دسترسی به آنها را نیز معین می نماید : عمومی(public)، داخلی(internal)، حفاظت شده (protected) ، حفاظت شده داخلی(protected internal) و خصوصی(private). البته باید توجه کرد که مسلماً کلمات کلیدی هر یک از زبانها با سایر زبانها متفاوت است اما ساختار اصلی آنها در CLR یکسان است.
سوال مهمی که در اینجا مطرح می گردد، اینست که چرا از چندین زبان استفاده می شود؟ برای پاسخ به این سوال توجه شما را به پروژه های تجاری عظیم جلب می کنم. همانطور که می دانید هر پروژه تجاری دارای شرایط و ویژگیهای خاص به خود است و یکی از مهمترین عوامل در تولید و راهبری پروژه های امروزی امکان استفاده مجدد از برنامه ها است. استفاده از چندین زبان برنامه نویسی اولاً می تواند نیاز هر نوع پروژه ای را طبق خواستهای آن برآورده کند و ثانیاً قابلیت استفاده مجدد را افزایش می دهد.
یکی دیگر از مزایای استفاده از چندین زبان برنامه نویسی، تجارت بین المللی است، بدین معنا که هر شرکت می تواند نرم افزار و محصول خود را با یکی از زبانهای مورد نظر خود ساخته و بدون نگرانی از عدم همخوانی آن با سایر محصولات به بازار ارایه نماید. پشتیبانی .Net از رنج وسیعی از زبانهای برنامه نویسی امکان به اشتراک گذاری کدها و استفاده مجدد از برنامه ها را به راحتی فراهم کرده و عصر جدیدی را در تولید نرم افزار ایجاد نموده است.
مزایای پشتیبانی از چندین زبان برنامه نویسی
این امکان باعث می شود تا هر فرد با توجه به علایق و سوابق کاری خود به برنامه نویسی با زبانی خاص بپردازد. بعنوان مثال فرض کنید گروهی مدتها با COBOL برنامه نویسی کرده اند، حال چون .Net از این زبان نیز پشتیبانی می کند، این گروه با صرف مدت زمانی کوتاه می توانند به .Net روی آورده و از مزایای آن بهره مند شوند. از دیگر مزایای چند زیانی استفاده مجدد از مولفه ها و اجزای برنامه های نوشته شده است.
البته به یک نکته مهم باید توجه کرد، که منظور در این جا این نیست که در یک پروژه با چندین زبان شروع به برنامه نویسی کنیم، اما با قابلیت .Net می توانیم مثلاً dll های نوشته شده به زبان C# را در یک پروژه ای که با زبان VB.Net نوشته می شود، مورد استفاده قرار دهیم.
در این جا باید به این نکته نیز توجه کرد که همگونی و سازگاری بین دو زبان همیشه بصورت کامل و خودکار صورت نمی گیرد و در برخی موارد هر زبان ویژگی های خاص خود را دارد که در زبان دیگر قابل اجرا و شناسایی نمی باشد. بعنوان مثال، برنامه های VB.Net نمی توانند با dll های C# که دارای متدهای عمومی هستند و نوع آنها به طور اشاره گر(pointer) تعریف شده است، کار نمایند.
"خصوصیات عمومی زبان" یا CLS به منظور حل چنین مشکلاتی طراحی شده است. CLS ویژگی های عمومی یک زبان را مشخص می کند و تعیین می کند که زبانها در صورت نیاز به اشتراک گذاری کدها تا چه حدی می توانند عمل نمایند. بعنوان مثال، C# برای اینکه بخواهد با CLS همخوانی داشته باشد، نباید اشاره گرها و نوع های بدون علامت را به صورت عمومی(public) در نظر بگیرد.
2-4) آغاز کار با C#
در این قسمت با ارائه چند برنامه و مثال ساده به طرز کار زبان C# می پردازیم. اهداف این قسمت عبارتند از :
* فهم ساختار پایه ای یک برنامه C#
* آشنایی با Namespace
* آشنایی با کلاس (Class)
* آشنایی با عملکرد متد Main()
* آشنایی با ورودی/خروجی یا I/O
لیست 1-4، یک برنامه ساده با عنوان Welcome در زبان C#
// Namespace اعلان
using System;
// کلاس آغازین برنامه
class WelcomeCSS
{
// آغاز کار اجرای برنامه
public static void Main()
{
// نوشتن متن در خروجی
Console.WriteLine("Welcome to the C# Persian Tutorial!");
}
}
برنامه لیست 1-4 دارای 4 پارامتر اصلی است، اعلان Namespace، کلاس، متد Main() و یک دستور زبان C#.
در همین جا باید به یک نکته اشاره کنم، برای زبان C# همانند بیشتر زبانهای برنامه سازی دو نوع کامپایلر وجود دارد. یک نوع کامپایلر که به کامپایلر Command Line معروف است و نوع دیگر کامپایلر Visual است. کامپایلر های Command Line محیطی شبیه به محیط DOS دارند و با دادن یک سری دستورات به اجرا در می آیند. کامپایلرهای Visual محیطی همانند ویندوز دارند که با دارا بودن محیط گرافیکی و ابزارهای خاص، برنامه نویس را در امر برنامه سازی کمک می کنند. از نمونه های هر یک از کامپایلرها، می توان به Microsoft C# Command Line Compiler که یک کامپایلر Command Line و Microsoft Visual C# که یک کامپایلر Visual است، اشاره کرد. البته در حال حاضر بیشتر از کامپایلرهای ویژوال استفاده می شود.
فعلاً برای اجرای برنامه ها می توانید از Visual Studio.Net استفاده کنید. پس از نصب آن، وارد محیط C# شده و در قسمت انتخاب برنامه جدید گزینه Console را جهت اجرای برنامه ها انتخاب نمایید.
برای اجرای کد بالا در صورتیکه از محیط ویژوال استفاده می کنید باید بر روی دکمه Run کلیک کنید و در صورتیکه کامپایلر Command Line دارید با دستور زیر می توانید برنامه را اجرا کنید : csc Welcome.cs
پس از اجرای برنامه، کامپایلر برای شما یک فایل قابل اجرا(Executable) تحت نام Welcome.exe تولید می کند.
نکته : در صورتیکه از Visual Studio.Net(VS.Net) استفاده کنید، پس از اجرای برنامه، یک صفحه برای نمایش خروجی به سرعت باز شده و بسته می شود و شما قادر به دیدن خروخی نخواهید بود. برای اینکه بتوانید خروجی برنامه را ببینید، در انتهای برنامه دستور زیر را وارد نمایید :
Console.ReadLine();
استفاده از این دستور باعث می شود تا برنامه منتظر دریافت یک ورودی از کاربر بماند، که در این حالت شما می توانید خروجی برنامه خود را دیده و سپس با زدن کلید Enter برنامه را خاتمه دهید.
نکته دیگری که در مورد زبان برنامه نویسی C# باید مورد توجه قرار دهید اینست که این زبان Case Sensitive است، بدین معنا که به حروف کوچک و بزرگ حساس است یعنی برای مثال ReadLine با readLine متفاوت است به طوریکه اولی جزو دستورات زبان C# و دومی به عنوان یک نام برای متغیر یا یک تابع که از طرف کاربر تعریف شده است در نظر گرفته می شود.
اعلان Namespace به سیستم اعلان می نماید که شما از توابع کتابخانه ای System جهت اجرای برنامه ها خود استفاده می نمایید. دستوراتی مانند WriteLine و ReadLine جزو توابع کتابخانه ای System می باشند. اغلب دستورات و توابع مهم و کلیدی استفاده از کنسول ورودی/خروجی در این کتابخانه می باشد. در صورتیکه در ابتدای برنامه از using System استفاده نکنید، یابد در ابتدای هر یک از دستورات برنامه که مربوط این کتابخانه است، از کلمه System استفاده نمایید. بعنوان مثال در صورت عدم استفاده از using System باید از دستور System.Console.WriteLine() به جای Console.WriteLine() استفاده نمایید.
تعریف کلاس،Class Welcome CSS، شامل تعریف داده ها(متغیرها) و متدها جهت اجرای برنامه است. یک کلاس، جزو معدود عناصر زبان C# است که بوسیله آن می توان به ایجاد یک شی (Object) از قبیل واسط ها (Interfaces) و ساختارها(Structures)، پرداخت. توضیحات بیشتر در این زمینه در قسمت های آینده ذکر می شوند. در این برنامه کلاس هیچ داده و متغیری ندارد و تنها شامل یک متد است. این متد، رفتار(Behavior) این کلاس را مشخص می کند.
متد درون این کلاس بیان می کند که این کلاس چه کاری را پس از اجرا شدن انجام خواهد داد. کلمه کلیدی Main() که نام متد این کلاس نیز می باشد جزو کلمات رزرو شده زبان C# است که مشخص می کند برنامه از کجا باید آغاز به کار نماید. وجود متد Main() در تمامی برنامه های اجرایی ضروری است. در صورتیکه یک برنامه حاوی متد Main() نباشد بعنوان توابع سیستمی همانند dll های ویندوز در نظر گرفته می شود.
قبل از کلمه Main() کلمه دیگری با عنوان static آورده شده است. این کلمه در اصطلاح Modifier می گویند. استفاده از static برای متد Main() بیان می دارد که این متد تنها در در همین کلاس قابل اجراست و هیچ نمونه ای (Instance) دیگری از روی آن قابل اجرا نمی باشد. استفاده از static برای متد Main() الزامی است زیرا در ابتدای آغاز برنامه هیچ نمونه ای از هیچ کلاس و شی ای موجود نمی باشد و تنها متد Main() است که اجرا می شود. (در صورتیکه با برخی اصطلاحات این متن از قبیل کلاس، شی، متد و نمونه آشنایی ندارید، این به دلیل آنست که این مفاهیم جزو مفاهیم اولیه برنامه نویسی شی گرا (OOP) هستند.
هر متد باید دارای یک مقدار بازگشتی باشد، یعنی باید مقداری را به سیستم بازگرداند، در این مثال نوع بازگشتی void تعزیف شده است که نشان دهنده آنست که این متد هیچ مقداری را باز نمی گرداند یا به عبارت بهتر خروجی ندارد. همچنین هر متد می تواند دارای پارامترهایی نیز باشد که لیست پارامترهای آن در داخل پرانتزهای جلوی آن قرار می گیرد. برای سادگی کار در این برنامه متد ما دارای هیچ پارامتری نیست ولی در ادامه همین قسمت به معرفی پارامترها نیز می پردازم.
متد Main() رفتار و عمل خود را بوسیله Console.WriteLine(…) مشخص می نماید. Console کلاسی در System است و WriteLine() متدی در کلاس Console. در زبان C# از اپراتور "." (نقطه dot) جهت جداسازی زیرروتین ها و زیرقسمتها استفاده می کنیم. همانطور که ملاحظه می کنید چون WriteLine() یک متد درون کلاس Console است به همین جهت از "." جهت جداسازی آن استفاده کرده ایم.
در زبان C#، برای قرار دادن توضیحات در کد برنامه از // استفاده می کنیم. بدین معنا که کامپایلر در هنگام اجرای برنامه توجهی به این توضیحات نمی کند و این توضیحات تنها به منظور بالا بردن خوانایی متن و جهت و کمک به فهم بهتر برنامه قرار می گیرند. استفاده از // تنها در مواردی کاربرد دارد که توضیحات شما بیش از یک خط نباشد. در صورت تمایل برای استفاده از توضیحات چند خطی باید در ابتدای شروع توضیحات از /* و در انتها آن از */ استفاده نمایید. در این حالت تمامی مطالبی که بین /* */ قرار می گیرند به عنوان توضیحات (Comments) در نظر گرفته می شوند.
تمامی دستورات (Statements) با ";"، سمی کولون، پایان می یابند. کلاس ها و متد ها با } آغاز شده و با { خاتمه می یابند. تمامی دستورات بین { } یک بلوک را می سازند.
بسیاری از برنامه ها از کاربر ورودی دریافت می کنند. انواع گوناگونی از این ورودی ها می توانند به عنوان پارامتری برای متد Main() در نظر گرفته شوند. لیست 2-1 برنامه ای را نشان می دهد نام کاربر را از ورودی دریافت کرده و آن را بر روی صفحه نمایش می دهد. این ورودی به صورت پارامتری برای متد Main() در نظر گرفته شده است.
لیست 2-4 : برنامه ای که ورودی را از کاربر، بعنوان پارامتر Main()، دریافت می کند.
// Namespace اعلان
using System;
// کلاس آغازین برنامه
class NamedWelcome
{
// آغاز اجرا برنامه
public static void Main(string[] args)
{
// نمایش بر روی صفحه
Console.WriteLine("Hello, {0}!", args[0]);
Console.WriteLine("Welcome to the C# Persian Tutorial!");
}
}
توجه داشته باشید که این برنامه، ورودی را به صورت Command-Line دریافت می کند و در هنگام اجرای برنامه باید ورودی را در Command-Line وارد نمایید. در صورتیکه ورودی را وارد ننمایید برنامه دچار مشکل شده و متوقف خواهد شد.
همان طور که در لیست 2-4 مشاهده می نمایید، پارامتر متد Main() با عنوان args مشخص شده است. با استفاده از این نام در داخل متد می توان آن استفاده نمود. نوع این پارامتر از نوع آرایه ای از نوع رشته (string[]) در نظر گرفته شده است. انواع(types) و آرایه ها را در قسمت های بعدی بررسی می کنیم. فعلاً بدانید که آرایه رشته ای جهت نگهداری چندین کاراکتر مورد استفاده قرار می گیرد. [] مشخص کننده آرایه هستند که مانند یک لیست عمل می کند.
همانطور که ملاحظه می کنید در این برنامه دو دستور Console.WriteLine(…) وجود دارد که اولین دستور مقداری با دستور دوم متفاوت است. همانطور که مشاهده می کنید داخل دستور Console.WriteLine(…) عبارتی به شکل {0} وجود دارد. این آرگومان، نشان می دهد که به جای آن چه مقداری باید نمایش داده شود که در این جا args[0] نشان داده می شود. عبارتی که داخل " " قرار دارد عیناً در خروجی نمایش داده می شود، به جای آرگومان {0}، مقداری که پس از " قرار دارد، قرار می گیرد. حال به آرگومان بعدی یعنی args[0] توجه کنید. مقدار صفر داخل [] نشان می دهد که کدام عنصر از آرایه مورد استفاده است. در C# اندیس آرایه از صفر شروع می شود به همین جهت برای دسترسی به اولین عنصر آرایه باید از اندیس صفر استفاده کنیم.
مجدداً به آرگومان {0} بازگردیم. این آرگومان نشان می دهد که یک مقدار باید در رشته خروجی قرار گیرد، این مقدار همان args[0] است. اگر شما این برنامه را از طریق Command-Line اجرا نمایید خروجی شبیه به زیر خواهید گرفت :
>Hello!, Meysam!
>Welcome to C# Persian Tutorial!
همان گونه که می بینید، پس از اجرای برنامه نام شما که از طریق Command-Line آنرا وارد نموده اید در خروجی ظاهر می شود. استفاده از آرگومان {n}، که در آن n یک مقدار عددی است، جهت فرمت دادن به متن خروجی است که بر روی صفحه به نمایش در می آید. مقدار n از صفر آغاز شده و به ترتیب افزایش می باید. به مثال زیر توجه کنید :
Console.WriteLine("Hello! ,{0} ,{1}, {2}",args[0],args[1],args[2]);
این خط از برنامه سه مقدار args[0],args[1],args[2] را در خروجی به ترتیب نمایش می دهد. ملاحظه می نمایید که چون 3 مقدار را می خواهیم نمایش دهیم، سه بار از آرگومان {n} استفاده کرده ایم و هر بار یک واحد به مقدار قبلی افزوده ایم. در آینده بیشتر با این مفاهیم آشنا می شویم.
مطلبی که باید در مورد لیست 2-4 به آن توجه شود آنست که این برنامه تنها از طریق Command-Lineقابل اجراست و در صورتیکه کاربر از این مطلب که برنامه باید دارای ورودی به صورت Command-Line باشد، بی اطلاع باشد و ورودی را در Command-Line وارد نکند، برنامه متوقف شده و اجرا نمی شود. پس برای رفع چنین مشکلی باید از روش بهتری جهت دریافت ورودی از کاربر استفاده کرد.
لیست 3-4 : یک برنامه که قابلیت محاوره با کاربر را دارد.
// Namespace اعلان
using System;
// کلاس آغازین برنامه
class InteractiveWelcome
{
//آغاز اجرای برنامه
public static void Main()
{
// متنی بر روی صفحه نمایش داده می شود
Console.Write("What is your name?: ");
//متنی نمایش داده شده و برنامه منتظر دریافت ورودی می ماند
Console.Write("Hello, {0}! ", Console.ReadLine());
Console.WriteLine("Welcome to the C# Persian Tutorial!");
}
}
همانطوریکه در این برنامه دیده می شود، متد Main() دارای پارامتر نیست. در عوض یک خط به متن برنامه لیست 2-1 اضافه شده است. در اولین خط از این برنامه، متنی با عنوان اینکه نام شما چیست؟ بر روی صفحه ظاهر می شود. سپس در خط بعدی پس از نوشتن کلمه Hello, ، برنامه منتظر دریافت ورودی از کاربر می شود. بدین معنی که این بار تا زمانیکه کاربر متنی را به عنوان نام خود وارد نکند اجرای برنامه به پیش نخواهد رفت و خط بعدی اجرا نمی شود. این برنامه روش ایجاد ارتباط از طریق برنامه با کاربر را نمایش می دهد. در این مثال کاربر دقیقاً متوجه می شود که چه زمانی باید اطلاعات را وارد نماید و این اطلاعات چه باید باشد در حالیکه در مثال قبل چنین نبود. همانگونه که می بینید در این برنامه آرگومان {0} مستقیماً از طریق دستور Console.ReadLine() دریافت می شود و بلافاصله در خروجی نمایش داده می شود. دستور ReadLine() نیز یکی از متدهای کلاس Console است که بوسیله آن رشته ورودی خوانده می شود.
خروجی برنامه فوق به شکل زیر است :
What is your name?:
(سپس برنامه منتظر دریافت متنی از ورودی توسط کاربر می ماند)
(پس از اینکه کاربر رشته ای را وارد کرد و کلیدEnter را فشار داد، متن زیر نمایش داده می شود.)
Hello, Meysam!
(سپس اجرای برنامه به دستور بعدی منتقل می شود)
Welcome to the C# Persian Tutorial!
خروجی کامل برنامه :
What is your name?:
Hello, Meysam! Welcome to the C# Persian Tutorial!
توجه کنید که ReadLine() به عنوان یک متد، مقداری را به سیستم بازمی گرداند. این مقدار در این برنامه به آرگومان {0} برگردانده می شود. این خط از برنامه را می توان طور دیگری هم نوشت :
string myName=Console.ReadLine();
Console.WriteLine("Hello, {0}!",myName);
در این حالت ما یک متغیر از نوع رشته با نام myName تعریف کرده ایم که مقدار ورودی در آن ذخیره می شود و سپس از این مقدار به عنوان مقداری که {0} می پذیرد استفاده کرده ایم.
در این قسمت آموختید که ساختار کلی یک برنامه C# چگونه است. هر برنامه C# از یک کلاس اصلی تشکیل می شود که این کلاس شامل داده ها و متغیرها و متدهایی می باشد. متد آغازین برنامه که برنامه با آن شروع به اجرا می کند، متد Main() است. با استفاده از توابع کتابخانه ای می نوان به کلاسها و متدهای C# دسترسی پیدا کرد. از جمله این توابع System بود که یکی از کلاسهای آن Console و چند متد این کلاس، متدهای WriteLine() و ReadLine() بودند.
3-4) متدها
در این قسمت با متدها در زبان C# آشنا می شوید. اهداف این قسمت به شرح زیر می باشد :
درک ساختار یک متد
درک تفاوت بین متدهای استاتیک (static methods) و متدهای نمونه (instance)
ایجاد نمونه جدید از اشیاء
نحوه فراخوانی متدها
درک چهار گونه متفاوت پارامترها
نحوه استفاده از مرجع this
تا کنون تمامی اعمالی که ما در برنامه هایمان انجام می دادیم در متد Main() اتفاق می افتادند. این روش برای برنامه های ساده و ابتدایی که استفاده کردیم مناسب بود، اما اگر برنامه ها پیچیده تر شوند و تعداد کارهای مورد نظر ما گسترش یابد، استفاده از متدها جایگزین روش قبل می گردد. متدها فوق العاده مفید هستند، چراکه کارها را به بخشهای کوچکتر و مجزا تقیسم می کنند و در نتیجه استفاده از آنها آسان تر خواهد بود.
ساختار کلی یک متد به صورت زیر است :
[attributes][ modifiers] return-type method-name ([ parameters] ) { statements }
دو قسمت attributes و modifiers را در آینده مورد بررسی قرار خواهیم داد. return-type نوعی است یک متد باز می گرداند و می تواند هر یک از انواع تعریف شده زبان C# و یا از انواع تعریف شده توسط کاربر باشد. هر متد با نام آن شناخته می شود. method-name نام انتخابی برنامه نویس برای یک متد است و از طریق همین نام فراخوانی متد انجام می شود. پارامترها (parameters) مولفه ها یا متغیرهایی هستند که برای انجام یکسری پردازش به متد ارسال می شوند و از طریق آنها می توان اطلاعاتی را به متد ارسال و یا از آن دریافت نمود، و در نهایت دستورالعمهای متد، دستورهایی از زبان C# هستند که بوسیله آنها عمل مورد نظر برنامه نویس انجام می شود و عملی است که یک متد آنرا انجام می دهد. مثال 4-4 پیاده سازی یک متد ساده را نمایش می دهد.
using System;
class OneMethod
{
public static void Main()
{
string myChoice;
OneMethod om = new OneMethod();
do
{
myChoice = om.getChoice();
// تصمیمی بر اساس انتخاب کاربر گرفته می شود
switch(myChoice)
{
case "A":
case "a":
Console.WriteLine("You wish to add an address.");
break;
case "D":
case "d":
Console.WriteLine("You wish to delete an address.");
break;
case "M":
case "m":
Console.WriteLine("You wish to modify an address.");
break;
case "V":
case "v":
Console.WriteLine("You wish to view the address list.");
break;
case "Q":
case "q":
Console.WriteLine("Bye.");
break;
default:
Console.WriteLine("{0} is not a valid choice", myChoice);
break;
}
// اجرای برنامه برای دیدن نتایج موقف می شود
Console.WriteLine();
Console.Write("Press Enter key to continue…");
Console.ReadLine();
Console.WriteLine();
} while (myChoice != "Q" && myChoice != "q");
// اجرای برنامه تا زمانیکه کاربر بخواهد ادامه می یابد
}
string getChoice()
{
string myChoice;
// منویی را نمایش می دهد
Console.WriteLine("My Address Bookn");
Console.WriteLine("A – Add New Address");
Console.WriteLine("D – Delete Address");
Console.WriteLine("M – Modify Address");
Console.WriteLine("V – View Addresses");
Console.WriteLine("Q – Quitn");
Console.Write("Choice (A,D,M,V,or Q): ");
// ورودی دریافتی از کاربر را بررسی می کند
myChoice = Console.ReadLine();
Console.WriteLine();
return myChoice;
}
}
نوع بازگشتی متد getChoice() از نوع رشته ای است. از این رشته در دستور switch در متد Main() استفاده می شود. همانطور که ملاحظه می نمایید، پرانتزهای متد getChoice() خالی هستند، یعنی این متد دارای پارامتر نیست، از اینرو هیچ اطلاعاتی به/ از این متد منتقل نمی شود.
درون این متد، ابتدا متغیر myChoice را اعلان نموده ایم. هرچند نام و نوع این متغیر همانند متغیر myChoice موجود در متد Main() است، اما این دو متغیر دو متغیر کاملاً مجزا از یکدیگر می باشند. هر دو این متغیرها، متغیرهای محلی (Local) هستند، از اینرو تنها درون بلوکی که تعریف شده اند قابل دسترس می باشند. به بیان دیگر این دو متغیر از وجود یکدیگر اطلاعی ندارند.
متد getChoice() منویی را در کنسول نمایش می دهد و ورودی انتخابی کاربر را دریافت می نماید. دستور return داده ها را از طریق متغیر myChoice به متد فراخواننده آن، یعنی Main()، باز می گرداند. توجه داشته باشید که، نوع متغیری که توسط دستور return باز گردانده می شود، باید دقیقاً همانند نوع بازگشتی متد باشد. در این مثال نوع بازگشتی، رشته است.
در C# دو گونه متد وجود دارد. یکی متدهای استاتیک (Static) و دیگری متدهای نمونه (Instance). متدهایی که در اعلان خود شامل کلمه کلیدی static هستند، از نوع استاتیک هستند، بدین معنا که هیچ نمونه ای از روی این متد قابل ایجاد نیست و این تنها همین نمونه موجود قابل استفاده است. از روی متدهای استاتیک نمی توان شیء (Object) ایجاد کرد. در صورتیکه در اعلان متد از کلمه کلیدی static استفاده نشده باشد، متد بعنوان متد نمونه در نظر گرفته می شود، بدین معنا که از روی آن می توان نمونه ایجاد کرد و شیء تولید نمود. هر یک از اشیاء ایجاد شده از روی این متدها، تمامی عناصر آن متد را دارای می باشند.
در این مثال، چون getChoice() بصورت استاتیک اعلان نشده است، پس باید برای استفاده از آن شیء جدیدی تولید شود. تولید شیء جدید بوسیله OneMethod om = new OneMethod() صورت می پذیرد. در سمت چپ این اعلان، مرجع این شیء جدید، یعنی om، قرار دارد که از نوع OneMethod است. در اینجا توجه به یک نکته بسیار مهم است، om به خودی خود شیء نیست، بلکه می تواند مرجعی به شی ای از نوع OneMethod() را در خود نگه دارد. در سمت راست این اعلان، تخصیص شیء جدیدی از نوع OneMethod() به متغیر om صورت گرفته است. کلمه کلیدی new عملگری است که شیء جدیدی را در heap ایجاد می نماید. اتفاقی که اینجا روی داده اینست که نمونه جدیدی از OneMethod() در heap تولید شده و سپس به مرجع om تخصیص داده می شود. حال که نمونه ای از متد OneMethod() را به om تخصیص داده ایم، از طریق om می توانیم با این متد کار نماییم.
متدها، فیلدها و سایر اعضای یک کلاس از طریق عملگر نقطه "." قابل دسترس هستند. هنگامیکه می خواهیم متد getChoice() را فراخوانی کنیم، بوسیله عملگر نقطه از طریق om به آن دسترسی پیدا می نماییم : om.getChoice() . برای نگهداری مقداری که getChoice() بر می گرداند، از عملگر "=" استفاده نموده ایم. رشته بازگشتی از متد getChoice() درون متغیر محلی myChoice متد Main() قرار می گیرد. از این قسمت، اجرای برنامه همانند قبل است.
پارامترهای متد
به مثال 5-4 توجه کنید.
using System;
class Address
{
public string name;
public string address;
}//Addressپایان کلاس
class MethodParams
{
public static void Main()
{
string myChoice;
MethodParams mp = new MethodParams();
do
{
// منویی نمایش داده شده و ورودی از کاربر دریافت می گردد
myChoice = mp.getChoice();
// تصمیمی بر اساس ورودی کاربر گرفته می شود
mp.makeDecision(myChoice);
// جهت دیدن نتایج توسط کاربر، اجرای برنامه موقتا موقف می گردد
Console.Write("Press Enter key to continue…");
Console.ReadLine();
Console.WriteLine();
} while (myChoice != "Q" && myChoice != "q");
// اجرای حلقه تا زمانیکه کاربر بخواهد ادامه پیدا می نماید
}//Mainپایان متد
// نمایش منو و دریافت ورودی از کاربر
string getChoice()
{
string myChoice;
// نمایش منو
Console.WriteLine("My Address Bookn");
Console.WriteLine("A – Add New Address");
Console.WriteLine("D – Delete Address");
Console.WriteLine("M – Modify Address");
Console.WriteLine("V – View Addresses");
Console.WriteLine("Q – Quitn");
Console.WriteLine("Choice (A,D,M,V,or Q): ");
// دریافت ورودی کاربر
myChoice = Console.ReadLine();
return myChoice;
}//getChoice()پایان متد
// تصمیم گیری
void makeDecision(string myChoice)
{
Address addr = new Address();
switch(myChoice)
{
case "A":
case "a":
addr.name = "Meysam";
addr.address = "C# Persian";
this.addAddress(ref addr);
break;
case "D":
case "d":
addr.name = "Ghazvini";
this.deleteAddress(addr.name);
break;
case "M":
case "m":
addr.name = "CSharp";
this.modifyAddress(out addr);
Console.WriteLine("Name is now {0}.", addr.name);
break;
case "V":
case "v":
this.viewAddresses("Meysam", "Ghazvini", "C#", "Persian");
break;
case "Q":
case "q":
Console.WriteLine("Bye.");
break;
default:
Console.WriteLine("{0} is not a valid choice", myChoice);
break;
}
}
// وارد کردن یک آقسمت
void addAddress(ref Address addr)
{
Console.WriteLine("Name: {0}, Address: {1} added.", addr.name, addr.address);
}
// حذف یک آقسمت
void deleteAddress(string name)
{
Console.WriteLine("You wish to delete {0}'s address.", name);
}
// تغییر یک آقسمت
void modifyAddress(out Address addr)
{
//Console.WriteLine("Name: {0}.", addr.name); // خطا رخ می دهد
addr = new Address();
addr.name = "Meysam";
addr.address = "C# Persian";
}
// نمایش آقسمت ها
void viewAddresses(params string[] names)
{
foreach (string name in names)
{
Console.WriteLine("Name: {0}", name);
}
}
}
مثال 5-4، نمونه تغییر یافته مثال 4-4 است که در آن تمامی برنامه ماژولار شده و به متدهای مختلف تقسیم شده است. در زبان C# چهار گونه پارامتر وجود دارند : ref، out، params و value . بمنظور آشنایی با پارامترها، در مثال 5-4 کلاسی با نام Address با دو فیلد از نوع رشته تولید کرده ایم.
درون متد Main()، متد getChoice() را فراخوانی کرده ایم تا از کاربر ورودی دریافت کنیم و این ورودی در متغیر رشته ای myChoice قرار می گیرد. سپس متغیر myChoice را بعنوان آرگومان به متد makeDecision() ارسال نموده ایم. در اعلان myDecision()، همانطور که ملاحظه می نمایید، پارامتر این متد از نوع رشته و با نام myChoice تعریف شده است. توجه نمایید که این متغیر نیز محلی است و تنها درون متد makeDecision() قابل استفاده است. هرگاه در اعلان متد، برای پارامترهای آن هیچ modifier آورده نشود، این پارامتر بعنوان value در نظر گرفته می شود. در مورد پارامترهای مقداری (value parameter) ، اصل مقدار متغیر یا پارامتر به پشته (Stack) کپی می شود. متغیرهایی که بصورت مقداری بعنوان پارامتر برای یک متد ارسال می شوند، همگی محلی بوده و تغییرات ایجاد شده بر روی آنها به هیچ وجه تغییری بر روی متغیر اصلی ایجاد نمی نماید.
دستور switch در متد makeDecision() برای هر case یک متد را فراخوانی می نماید. فراخوانی این متدها با آنچه در متد Main() دید مقداری متفاوت است. علاوه بر مرجع mp، در این فراخوانی ها از کلمه کلیدی this نیز استفاده شده است. کلمه کلیدی this ارجاعی به شیء فعلی دارد.
متد addAddress() پارامتری از نوع ref دارد. وجود چنین پارامتری بدین معناست که مرجعی از این پارامتر به متد ارسال می شود و این مرجع همچنان به شیء اصلی درون heap نیز اشاره دارد چراکه آقسمت شیء مورد نظر به متد کپی می شود. در مورد پارامترهای ref، هرگونه تغییری که بر روی متغیر محلی رخ دهد، همان تغییر بر روی متغیر اصلی نیز اعمال می گردد. امکان تغییر مرجع وجود ندارد و تنها شی ای که مورد قسمت دهی واقع شده، می تواند تغییر پیدا نماید. پارامترهای مرجعی (ref) را می توان به عنوان عناصر ورودی/خروجی برای متد در نظر گرفت
پارامترهای out در مواردی استفاده می شوند که ارسال اطلاعات به متد از طریق پارامتر مد نظر نباشد، بلکه ارسال اطلاعات از متد مورد نظر باشد. استفاده از این پارامترها از اینرو کارآمد هستند که برنامه مجبور به کپی کردن پارامتر به متد نیست و از حجم سرباره (Overhead) برنامه می کاهد. در برنامه های عادی این مسئله چندان به چشم نمی آید، اما در برنامه های تحت شبکه که سرعت ارتباط و انتقال داده ها بسیار مهم است، این پارامترها ضروری می شوند.
متد modifyAddress() دارای پارامتری از نوع out است. پارامترهای out فقط به متد فراخواننده آن بازگشت داده می شوند. از آنجائیکه این پارامترها از متد فراخواننده هیچ مقداری دریافت نمی کنند و فقط درون متدی که به عنوان پارامتر به آن ارسال شده اند قابلیت تغییر دارند، از اینرو درون این متدهایی که به آنها ارسال می شوند، قبل از اینکه بتوان از آنها استفاده نمود باید مقداری به آنها تخصیص داده شود. اولین خط در متد modifyAddress() بصورت توضیحات نوشته شده است. این خط را از حالت توضیحات خارج کرده و سپس برنامه اجرا کنید تا ببینید چه اتفاقی رخ خواهد داد. هنگامیکه این پارامتر مقدار دهی شود و مقداری را به متد فراخواننده خود بازگرداند، این مقدار بر روی متغیر متد فراخواننده کپی می گردد. توجه نمایید که پارامترهای out می بایست قبل از دستور return درون متد مقدار دهی شده باشند.
یکی از ویژگیهای مفید زبان C#، وجود پارامترهای params است که بوسیله آنها می توان متدی را اعلان کرد که تعداد متغیری متغیر را به عنوان پارامتر دریافت نماید. پارامترهای params حتماً باید یکی از انواع آرایه تک بعدی و یا آرایه دندانه دار (Jagged Array) باشند. در متد makeDecision() چهار متغیر رشته ای را به متد viewAddresses() ارسال نموده ایم که این متد پارامترهای خود را بصورت params دریافت می نماید. همانطور که ملاحظه می نمایید، تعداد متغیرهای ارسالی به متد می تواند متغیر باشد اما دقت داشته باشید که تمامی این متغیرها در یک آرایه تک بعدی قرار گرفته اند. درون متد viewAddresses() نیز با استفاده از دستور foreach تمامی عناصر موجود در این آرایه را نمایش داده ایم. پارامترهای params فقط متغیرهای ورودی دریافت می نمایند و تغییرات اعمال شده تنها بر روی متغیر محلی تاثیر می گذارد.
4-4) Namespaces
اهداف این قسمت به شرح زیر می باشد :
آشنایی با Namespace در زبان C#
چگونگی استفاده از هدایتگر using (using directive)
چگونگی استفاده از هدایتگر alias (alias directive)
اعضای یک Namespace چه هستند؟
اگر به خاطر داشته باشید، در قسمت اول، در ابتدای برنامه از using System; استفاده نمودیم. با استفاده از این کد، امکان دسترسی ما به اعضای Namespace مورد نظر، که در System است، فراهم می شد. پس از مطالعه این قسمت، مطالب بسیاری درباره هدایتگر using فرا خواهید گرفت.
Namespace ها، المان های زبان C# هستند که شما را در سازماندهی کردن برنامه، کمک می کنند. پیاده سازی Namespace ها در کد برنامه بسیار مفید است چراکه از ایجاد مشکلات مربوط به استفاده مجدد کد، پیشگیری می نماید.
چگونگی ایجاد Namespace
به مثال زیر توجه نمایید.
// Namespace اعلان
using System;
// C# Persian Namespace
namespace csharp-persian
{
// کلاس آغازین برنامه
class NamespaceCSS
{
// آغاز اجرای برنامه
public static void Main()
{
// چاپ خروجی در کنسول
Console.WriteLine("This is the new C# Persian Namespace.");
}
}
}
مثال 6-4 چگونگی ایجاد یک Namespace را نشان می دهد. در این مثال ما با قرار دادن کلمه کلیدی namespace در جلوی csharp-persian یک Namespace جدید ایجاد نمودیم. مثال 7-4، Namespace های تودرتو را نشان می دهد.
// Namespace اعلان
using System;
// C# Persian Namespace
namespace csharp-persian
{
namespace tutorial
{
// کلاس آغازین برنامه
class NamespaceCSS
{
// آغاز اجرای برنامه
public static void Main()
{
// چاپ خروجی در کنسول
Console.WriteLine("This is the new C# Persian Namespace.");
}
}
}
}
Namespace ها این امکان را فراهم می آورند تا سیستمی جهت سازماندهی کدهای خود ایجاد نمایید. یک روش مناسب جهت سازماندهی Namespace های برنامه، استفاده از یک سیستم سلسله مراتبی است. بدین ترتیب که Namespace های عمومی را در بالای این ساختار قرار داده و هر چه در این ساختار پاین تر می آییم، Namespace های تخصصی تر قرار می گیرند. این سیستم سلسله مراتبی بوسیله Namespace های تودرتو قابل پیاده سازی هستند. این پیاده سازی در مثال7-4 نشان داده شده است. با قرار دادند کدهای خود در Namespace های فرعی می توانید کدهای خود را سازماندهی نمایید.
// Namespace اعلان
using System;
// C# Persian Tutorial Namespace
namespace csharp-persian.tutorial
{
// کلاس آغازین برنامه
class NamespaceCSS
{
//آغاز اجرای برنامه
public static void Main()
{
// چاپ خروجی در کنسول
Console.WriteLine("This is the new C# Persian Namespace.");
}
}
}
مثال8-4 روش دیگر ایجاد Namespace های تودرتو را نشان می دهد. همانطور که در این مثال مشاهده می نمایید، Namespace تودرتو با قرار دادن عملگر نقطه "." در بین csharp-persian و tutorial ایجاد شده است. این مثال از نظر کارآیی دقیقاً همانند مثال7-4 است و از نظر پیاده سازی آسان تر از آن می باشد.
فراخوانی اعضای یک Namespace
// Namespace اعلان
using System;
namespace csharp-persian
{
// namespace تودرتو
namespace tutorial
{
class myExample1
{
public static void myPrint1()
{
Console.WriteLine("First Example of calling another namespace member.");
}
}
}
// کلاس آغازین برنامه
class NamespaceCalling
{
// آغاز اجرای برنامه
public static void Main()
{
// چاپ خروجی در کنسول
tutorial.myExample1.myPrint1();
tutorial.myExample2.myPrint2();
}
}
}
//تودرتو بالا Namespaceمشابه Namespace
namespace csharp-persian.tutorial
{
class myExample2
{
public static void myPrint2()
{
Console.WriteLine("Second Example of calling another namespace member.");
}
}
}
مثال8-4 چگونگی فراخوانی اعضای Namespace نشان می دهد. در ابتدای مثال8-4، یک Namespace تودرتو اعلان شده است، tutorial درون csharp-persian، که دارای کلاس myExample1 و متد myPrint1 می باشد. متد Main() این متد را با نام tutorial.myExample1.myPrint1 فراخوانی می نماید. چون متد Main() و tutorial درون یک Namespace قرار دارند، دیگر نیازی به استفاده از نام csharp-persian غیر ضروری است.
در انتهای مثال8-4، یک Namespace دیگر بصورت csharp-persian.tutorial آورده شده است. کلاسهای myExamlpe1 و myExample2 هر دو متعلق به یک Namespace می باشند، هرچند می تواند آنها را مجزا از یکدیگر نوشت در حالیکه متعلق به یک Namespace باشند. درون متد Main()، متد
myPrint2 بصورتtutorial.myExample2.myPrint2 فراخوانی شده است. هرچند کلاس myExample2 خارج از محدوده ایست که متد myPrint2 فراخوانی شده است، نیازی به آمردن نام csharp-persian برای این فراخوانی وجود ندارد، زیرا هر دو کلاس متعلق به یک Namespace، یعنی csharp-persian هستند.
توجه نمایید که برای هر یک از کلاسهای myExample1 و myExample2 نامهای متفاوتی انتخاب شده است، زیرا هر عضو متعلق به یک Namespace باید دارای نام یکتایی باشد. برای متدهای myPrint1 و myPrint2 ، بعلت سادگی در امر یادگیری این مطلب، نامهای متفاوتی در نظر گرفته شده است. توجه نمایید که این دو متد بعلت اینکه در کلاسهای متفاوتی قرار دارند، می توان نامهای یکسانی برایشان انتخاب نمود، و در اینصورت هیچگونه تداخلی بین ایندو ایجاد نخواهد شد.
استفاده از هدایتگر using
// Namespace اعلان
using System;
using csharp_station.tutorial;
// کلاس آغازین برنامه
class UsingDirective
{
// آغاز اجرای برنامه
public static void Main()
{
// Namespace فراخوانی عضوی از
myExample.myPrint();
}
}
// C# PersianTutorial Namespace
namespace csharp-persian.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine("Example of using a using directive.");
}
}
}
در صورتیکه می خواهید متدهایی را بدون استفاده از نام کامل آنها، به همراه نام Namespace، استفاده نمایید، می توانید از هدایتگر using استفاده نمایید. در مثال 9-4، دوبار از هدایتگر using استفاده شده است. اولین استفاده از این هدایتگر، using System، دقیقاً مشابه به همان چیزی است که تا کنون در این قسمتها مشاهده نموده اید. با استفاده از این هدایتگر می توانید از اعضای موجود در System، بدون اینکه نیاز به تایپ کلمه System در هربار داشته باشید، استفاده نمایید. در myPrint()، کلاس Console عضوی از System است که دارای متد WriteLine() می باشد. اگر در ابتدای برنامه از هدایتگر using استفاده نکنیم، باید برای هر دفعه استفاده از متد WriteLine()، نام کامل آن یعنی System.Console.WriteLine() را تایپ نماییم.
به طور مشابه، استفاده از using csharp-persian.tutorial امکان استفاده از اعضای این Namespace را، بدون نیاز به تایپ نام کامل آنها فراهم می نماید. چون در ابتدای برنامه از هدایتگر using استفاده نموده ایم، در متن برنامه متد myPrint() را بصورت myExample.myPrint() استفاده نموده ایم، درصورتیکه از هدایتگر using استفاده نمی گردیم برای استفاده از این متد باید آنرا بصورت csharp-persian.tutorial.myExample.myPrint() می آوردیم.
استفاده از هدایتگر Alias
// Namespace اعلان
using System;
using csTut = csharp-persian.tutorial.myExample; // alias
// کلاس آغازین برنامه
class AliasDirective
{
// آغاز اجرای برنامه
public static void Main()
{
// Namespace فراخوانی عضوی از
csTut.myPrint();
myPrint();
}
// متدی که ممکن است تولید ابهام نماید.
static void myPrint()
{
Console.WriteLine("Not a member of csharp-persian.tutorial.myExample.");
}
}
// C# Persian Tutorial Namespace
namespace csharp-persian.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine("This is a member of csharp-persian.tutorial.myExample.");
}
}
}
در برخی موارد ممکن است با Namespace خاصی روبرو شوید که دارای نامی طولانی است و تمایل داشته باشید تا نام آنرا کوتاهتر نمایید. این کار با استفاده از ایجاد استعاره (Alias) امکان پذیر است. همانطور که در مثال10-4 ملاحظه می نمایید، با استفاده از
csTut = csharp-persian.tutorial.myExample یک استعاره تولید کرده ایم و در متن برنامه به جای استفاده از نام طولانی csharp-persian.tutorial.myExample از نام مستعار آن یعنی csTut استفاده نموده ایم. حال از این نام مستعار در هر جای برنامه می توان استفاده کرد. ما در این برنامه در متد Main() استفاده نموده ایم.
همچنین در متد Main()، فراخوانی از متد myPrint() مربوط به کلاس AliasDirective صورت گرفته است. نام این متد همانند myPrint() موجود در myExample است. علت اینکه می توان هر دو این متدها را همزمان فراخوانی کرد، استفاده از هدایتگر alias برای متد myPrint() مربوط به کلاس myExample است. (csTut.myPrint()) استفاده از این روش باعث می شود تا کامپایلر دریابد که کدام متد را باید اجرا نماید. در صورتیکه به اشتباه از هدایتگر alias (csTut.myPrint()) استفاده نکنیم، کامپایلر به اشتباه متد myPrint() مربوط به کلاس AliasDirective را دوبار اجرا خواهد کرد.
تا اینجا، ما تنها کلاسها را در Namespace ها نشان دادیم. Namespace ها انواع دیگری را نیز می توانند در خود داشته باشند که در زیر مشاهده می نمایید :
Classes
Structures
Interfaces
Enumerations
Delegates
5-4) آشنایی با کلاسها در C#
در این قسمت با کلاسها در زبان C# آشنا خواهید شد. اهداف این قسمت به شرح زیر می باشند :
پیاده سازی سازنده ها (Constructors)
درک تفاوت بین اعضای نمونه (Instance) و استاتیک (Static)
آشنایی با تخریب کننده ها (Destructors)
آشنایی با اعضای کلاسها
یک کلاس با استفاده از کلمه کلیدی class که بدنبال آن نام کلاس آمده باشد، اعلان می گردد و اعضای این کلاس درون {} اعلان می گردند. هر کلاس دارای سازنده ای می باشد که در هربار ایجاد نمونه ای جدید از آن کلاس، بصورت خودکار فراخوانی می گردد. هدف از سازنده، تخصیص دهی اعضای کلاس در زمان ایجاد نمونه ای جدید از کلاس است. سازنده ها دارای مقادیر بازگشتی نبوده و همواره نامی مشابه نام کلاس دارند. مثال 11-4نمونه ای از یک کلاس را نشان می دهد.
// Namespace اعلان
using System;
class OutputClass
{
string myString;
// سازنده
public OutputClass(string inputString)
{
myString = inputString;
}
// متد نمونه
public void printString()
{
Console.WriteLine("{0}", myString);
}
// تخریب کننده
~OutputClass()
{
// روتینی جهت آزادسازی برخی از منابع سیستم
}
}
// کلاس آغازین برنامه
class ExampleClass
{
// آغاز اجرای برنامه
public static void Main()
{
// OutputClass نمونه ای از
OutputClass outCl = new OutputClass("This is printed by the output class.");
// Output فراخوانی متد کلاس
outCl.printString();
}
}
در مثال11-4 دو کلاس دیده می شوند. کلاس بالایی، کلاس OutPutClass، دارای سازنده، متد نمونه و یک تخریب کننده است. همچنین این کلاس دارای فیلدی با نام myString است. توجه نمایید که چگونه سازنده این کلاس اعضای آنرا تخصیص دهی(مقداردهی) می نماید. در این مثال، سازنده کلاس رشته ورودی (inputString) را بعنوان آرگومان خود دریافت می نماید. سپس این مقدار داخل فیلد کلاس یعنی myString کپی می گردد.
همانطور که در ExampleClass مشاهده می نمایید، استفاده از سازنده الزامی نمی باشد. در این مورد سازنده پیش فرض ایجاد می گردد. سازنده پیش فرض، سازنده ای بدون هیچ نوع آرگومانی است. البته شایان ذکر است که سازنده هاییی بدون آرگومان همیشه مورد استفاده نبوده و مفید نیستند. جهت کارآمد کردن بیشتر سازنده های بدون آرگومان بهتر است آنها را با تخصیص دهنده (Initializers) پیاده سازی نمایید. به مثال زیر در این زمینه توجه نمایید :
public OutputClass() : this("Default Constructor String") { }
فرض کنید این عبارت در کلاس OutPutClass در مثال11-4 قرار داشت. این سازنده پیش فرض به یک تخصیص دهنده همراه شده است. ":" ابتدای تخصیص دهنده را مشخص می نما ید، و به دنبال آن کلمه کلیدی this آمده است. کلمه کلیدی this به شیء کنونی اشاره می نماید. استفاده از این کلمه، فراخوانی به سازنده شیء کنونی که در آن تعریف شده است، ایجاد می کند. بعد از کلمه کلیدی this لیست پارامترها قرار می گیرد که در اینجا یک رشته است. عملی که تخصیص دهنده فوق انجام می دهد، باعث می شود تا سازنده OutPutClass رشته ای را بعنوان آرگومان دریافت نماید. استفاده از تخصیص دهنده ها تضمین می نمایند که فیلدهای کلاس شما در هنگام ایجاد نمونه ای جدید مقدار دهی می شوند.
مثال فوق نشان داد که چگونه یک کلاس می تواند سازنده های متفاوتی داشته باشد. سازنده ای که فراخوانی می شود، به تعداد و نوع آرگومانهایش وابسته است.
در زبان C#، اعضای کلاسها دو نوع می باشند : اعضای نمونه و استاتیک. اعضای نمونه کلاس متعلق به رخداد خاصی از کلاس هستند. هربار که شی ای از کلاسی خاص ایجاد می کنید، در حقیقت نمونه جدیدی از آن کلاس ایجاد کرده اید. متد Main() در کلاس ExampleClass نمونه جدیدی از OutPutClass را تحت نام outCl ایجاد می نماید. می توان نمونه های متفاوتی از کلاس OutPutClass را با نامهای مختلف ایجاد نمود. هر یک از این نمونه های مجزا بوده و به تنهایی عمل می کنند. به عنوان مثال اگر دو نمونه از کلاس OutPutClass همانند زیر ایجاد نمایید :
OutputClass oc1 = new OutputClass("OutputClass1");
OutputClass oc2 = new OutputClass("OutputClass2");
با این اعلان، شما دو نمونه از کلاس OutPutClass را ایجاد کرده اید که یک از آنها دارای فیلد myString و متد printString() هستند و این فیلدها و متدها کاملاً از یکدیگر مجزا می باشند. به بیان دیگر درصورتیکه عضوی از کلاس استاتیک باشد از طریق ساختار نوشتاری <class name>.<static class member> قابل دسترس خواهد بود. در این مثال نمونه ها oc1 و oc2 هستند. فرض کنید کلاس OutPutClass دارای متد استاتیک زیر باشد :
public static void staticPrinter()
{
Console.WriteLine("There is only one of me.");
}
این متد را از درون متد Main() به صورت زیر می توانید فراخوانی نمایید :
OutputClass.staticPrinter();
اعضای استاتیک یک کلاس تنها از طریق نام آن کلاس قابل دسترس می باشند و نه از طریق نام نمونه ایجاد شده از روی کلاس. بدین ترتیب برای فراخوانی اعضای استاتیک یک کلاس نیازی به ایجاد نمونه از روی آن کلاس نمی باشد. همچنین تنها یک کپی از عضو استاتیک کلاس، در طول برنامه موجود می باشد. یک مورد استفاده مناسب از اعضای استاتیک در مواردی است که تنها یک عمل باید انجام گیرد و در انجام این عمل هیچ حالت میانی وجود نداشته باشد، مانند محاسبات ریاضی. در حقیقت، .Net Framework BCL خود دارای کلاس Math می باشد که از اعضای استاتیک بهره می برد.
نوع دیگر سازنده ها، سازنده های استاتیک هستند. از سازنده های استاتیک جهت مقدار دهی فیلدهای استاتیک یک کلاس استفاده می شود. برای اعلان یک سازنده استاتیک تنها کافیست که از کلمه کلیدی static در جلوی نام سازنده استفاده نمایید. سازنده استاتیک قبل از ایجاد نمونه جدیدی از کلاس، قبل از فراخوانی عضو استاتیک و قبل از فراخوانی سازنده استاتیک کلاس مشتق شده، فراخوانی می گردد. این سازنده ها تنها یکبار فراخوانی می شوند.
OutPutClass همچنین دارای یک تخریب کننده (Destructor) است. تخریب کننده ها شبیه به سازنده ها هستند، با این تفاوت که در جلوی خود علامت "~" را دارا می باشند. هیچ پارامتری دریافت نکرده و هیچ مقداری باز نمی گردانند. از تخریب کننده ها می توان در هر نقطه از برنامه که نیاز به آزادسازی منابع سیستم که در اختیار کلاس یا برنامه است، استفاده نمود. تخریب کننده ها معمولاً زمانی فراخوانی می شوند که Garbage Collector زبان C# تصمیم به حذف شیء مورد استفاده برنامه از حافظه و آزادسازی منابع سیستم، گرفته باشد. (Garbage Collector یا GC، یکی از امکانات .Net Framework مخصوص زبان C# است که سیستم بصورت اتوماتیک اقدام به آزادسازی حافظه و باز گرداندن منابع بلا استفاده به سیستم می نماید. فراخوانی GC بصورت خودکار رخ می دهد مگر برنامه نویس بصورت صریح از طریق تخریب کننده ها آنرا فراخوانی نماید. در مباحث پیشرفته تری که در آینده مطرح می کنیم خواهید دید که در چه مواقعی نیاز به فراخوانی تخریب کننده ها بصورت شخصی دارید.)
تا کنون، تنها اعضای کلاس که با آنها سر و کار داشته اید، متدها، فیلدها، سازنده ها و تخریب کننده ها بوده اند در زیر لیست کاملی از انواعی را که می توانید در کلاس از آنها استفاده نمایید آورده شده است :
• Constructors
• Destructors
• Fields
• Methods
• Properties
• Indexers
• Delegates
• Events
• Nested Classes
6-4) ارث بری کلاس ها
در این قسمت درباره ارث بری در زبان برنامه نویسی C# صحبت خواهیم کرد. اهداف این قسمت بشرح زیر می باشند :
پیاده سازی کلاسهای پایه (Base Class)
پیاده سازی کلاسهای مشتق شده (Derived Class)
مقدار دهی کلاس پایه از طریق کلاس مشتق شده
فراخوانی اعضای کلاس پایه
پنهان سازی اعضای کلاس پایه
ارث بری یکی از مفاهیم اساسی و پایه شی گرایی است. با استفاده از این ویژگی امکان استفاده مجدد از کد موجود فراهم می شود. بوسیله استفاده موثر از این ویژگی کار برنامه نویسی آسان تر می گردد.
ارث بری(Inheritance)
using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
}
}
خروجی این برنامه بصورت زیر است :
Parent Constructor.
Child Constructor.
I'm a Parent Class.
در مثال12-4 دو کلاس وجود دارد. کلاس بالای ParentClass و کلاس پائینی ChildClass است. کاری که میخواهیم در اینجا انجام دهیم اینست که زیر کلاسی ایجاد کنیم که با استفاده از کدهای موجود در ParentClass عمل نماید.
برای این منظور ابتدا باید در اعلان ChildClass مشخص کنیم که این کلاس می خواهد از کلاس ParentClass ارث بری داشته باشد. این عمل با اعلان public class ChildClass : ParentClass روی می دهد. کلاس پایه با قرار دادن ":" بعد از نام کلاس مشتق شده معین می شود.
C# فقط از ارث بری یگانه پشتیبانی می نماید. از اینرو تنها یک کلاس پایه برای ارث بری می توان معین نمود. البته باید اشاره کرد که ارث بری چندگانه تنها از واسطها (Interfaces) امکان پذیر است که در قسمتهای آینده به آنها اشاره می نماییم.
ChildClass دقیقاً توانائیهای ParentClass را دارد. از اینرو می توان گفت ChildClass یک ParentClass است. (ChildClass IS a ParentClass) ChildClass دارای متد Print() مربوط به خود نیست و از متد کلاس ParentClass استفاده می کند. نتیجه این عمل در خط سوم خروجی دیده می شود.
کلاسهای پایه به طور خودکار، قبل از کلاس های مشتق شده نمونه ای از روی آنها ایجاد می گردد. به خروجی مثال 1-8 توجه نمایید. سازنده ParentClass قبل از سازنده ChildClass اجرا می گردد.
برقراری ارتباط کلاس مشتق شده با کلاس پایه
به مثال13-4 که در زیر آمده است توجه نمایید.
using System;
public class Parent
{
string parentString;
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Child : Parent
{
public Child() : base("From Derived")
{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}
خروجی این برنامه بشکل زیر است :
From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.
کلاسهای مشتق شده در طول ایجاد نمونه می توانند با کلاس پایه خود ارتباط برقرار نمایند. در مثال14-4 چگونگی انجام این عمل را در سازنده ChildClass نشان می دهد. استفاده از " : " و کلمه کلیدی base باعث فراخوانی سازنده کلاس پایه به همراه لیست پارامترهایش می شود. اولین سطر خروجی، فراخوانی سازنده کلاس پایه را بهمراه رشته "From Derived" نشان می دهد.
ممکن است حالتی رخ دهد که نیاز داشته باشید تا متد موجود در کلاس پایه را خود پیاده سازی نمایید. کلاس Child این عمل را با اعلان متد Print() مربوط به خود انجام می دهد. متد Print() مربوط به کلاس Child، متد Print() کلاس Parent را پنهان می کند. نتیجه این کار آنست که متد Print() کلاس Parent() تا زمانیکه عمل خاصی انجام ندهیم قابل فراخوانی نمی باشد.
درون متد Print() کلاس Child، صریحاً متد Print() کلاس Parent را فراخوانی کرده ایم. این عمل با استفاده از کلمه کلیدی base قبل از نام متد انجام گرفته است. با استفاده از کلمه کلیدی base می توان به هر یک از اعضای public و protected کلاس پایه دسترسی داشت. خروجی مربوط به متد Print() کلاس Child در سطرها سوم و چهارم خروجی دیده می شوند.
روش دیگر دسترسی به اعضای کلاش پایه، استفاده از Casting صریح است. این عمل در آخرین سطر از متد Main() کلاس Child رخ داده است. توجه داشته باشید که کلاس مشتق شده نوع خاصی از کلاس پایه اش می باشد. این مسئله باعث می شود تا بتوان کلاس مشتق شده را مورد عمل Casting قرار داد و آنرا نمونه ای از کلاس پایه اش قرار داد. آخرین خط خروجی نشان می دهد که متد Print() کلاس Parent اجرا شده است.
به وجود کلمه کلیدی new در متد Print() کلاس Child توجه نمایید. این عمل باعث می شود تا متد Print() کلاس Child متد Print() کلاس پایه اش را پنهان نماید. درصورتیکه از کلمه کلیدی new استفاده نشود، کامپایلر پیغام اخطاری را توالید می کند تا توجه شما را به این مسئله جلب کند.
فصل 5
نتیجه گیری
علاوه بر مطالب یاد شده در فصل قبل مطالب دیگری نیز جهت طراحی برنامه نیاز بود که با توجه به کثرت مطالب از ارائه آنها خودداری نمودم. البته به طور خلاصه میتوان به مباحث OLE DB ها و مفاهیم شبکه و SQL اشاره نمود.
در هر حال استفاده از نرم افزار فوق باعث کاهش هزینه ها برای شرکت و افزاریش سرعت و بهره وری در شرکت میگردد. با توجه به استفاده از .NET 2 از نظر امنیت در شبکه نیز در جایگاه خوب و مناسبی میباشد. همچنین چون گزارش گیری ها با ASP.NET طراحی گردیده لذا امکان قرار دادن گزارش ها در سایت و برای بعضی افراد که به نرم افزار دسترسی ندارند ممکن میباشد.
بعلاوه دوره کوتاه ولی پربار مذکور باعث شد تا من تجارب جدیدی در زمینه برنامه نویسی بانک اطلاعاتی در C# یاد بگیرم و بیش از پیش با این زبان شیرین و قوی آشنا شوم.
در طول این دوره کوتاه من علاوه بر مطالب یاد شده، فرهنگ درست کارمندی و ارتباط داخلی را یاد گرفتم. رابطهای که در شرکت براساس رابطه و دوستی و نه ضابطه برقرار بود و شرکت بیشتر پیشرفت خودرا مدیون این روابط و مدیریت کارآمد آن است.
در آخر از دلسوزیهای و کمکهای مسئول کارآموزی جناب آقای برات زاده کمال تشکر را دارم و آرزوی شادکامی و موفقیت برای وی در تمامی مراحل زندگی را از خداوند منان خواهانم.
پیوستها