آموزش گام به گام #C (جلسه هفتم: مقدمه‌ای بر کلاس‌های #C)
1397/12/28 11:38 , میلاد صاحب نظر

آموزش گام به گام #C (جلسه هفتم: مقدمه‌ای بر کلاس‌های #C)

 در برنامه‌نویسی با #C کلاس‌ها از جمله اعضای جدایی ناپذیر کدها و پروژه‌ها هستند. برای اینکه بتوانید از کلاس‌ها استفاده کنید باید با اعضا و اهداف و طرز استفاده آنها آشنا باشید. در این جلسه مقدمه‌ای از کلاس‌ها بیان خواهد شد. با ما همراه باشید.

جلسه اول: آغاز کار با #C جلسه ششم: namespaceها جلسه یازدهم: اندیس گذار یا indexerها جلسه شانزدهم: استفاده از اتریبیوت‌ها جلسه بیست و یکم: متدهای بی‌نام یا anonymous
جلسه دوم: عملگرها، نوع‌ها و متغیرها جلسه هفتم: مقدمه‌ای بر کلاس‌های #C جلسه دوازدهم: ساختار یا structها جلسه هفدهم: enumها جلسه بیست و دوم: موضوعاتی در مورد نوع در #C
جلسه سوم: عبارات کنترلی - گزینشی جلسه هشتم: وراثت کلاس در #C جلسه سیزدهم: واسط یا interfaceها جلسه هجدهم: عملگرهای overloading جلسه بیست و سوم: کار با نوع‌های nullable
جلسه چهارم: عبارات کنترلی - حلقه‌ها جلسه نهم: چند ریختی جلسه چهاردهم: مقدمه‌ای بر delegateها و رویدادها جلسه نوزدهم: کپسوله‌سازی  
جلسه پنجم: متدها جلسه دهم: ویژگی یا propertyها جلسه پانزدهم: مقدمه‌ای بر کنترل خطا یا exception جلسه بیستم: مقدمه‌ای بر generic collectionها  

در این جلسه به معرفی کلاس‌های #C می‌پردازیم. اهداف ما به شرح زیر هستند:

  • پیاده‌سازی توابع سازنده یا constructorها
  • درک تفاوت بین اعضای instance و Static
  • درک توابع تخریب یا Destructorها
  • آشنایی با اعضای کلاس‌ها

از ابتدای شروع دوره تا الان دائما از کلاس‌ها استفاده کردیم. تا الان باید درک جزئی از اینکه کلاس به چه دردی می‌خورد و چگونه می‌توان یک کلاس ساخت را درک کرده باشید. در این جلسه ما بر اساس دانسته‌ها و علم شما پیش می‌رویم و اعضای مختلف کلاس را معرفی می‌کنیم.

کلاس‌ها با استفاده از کلیدواژه class شروع شده و با نام کلاس و مجموعه‌ای از اعضای کلاس(که در بین آکولاد‌ها نوشته می‌شوند)ادامه و خاتمه می‌یابند. هر کلاس دارای یک constructor است که به صورت خودکار، هر وقت یک instance از کلاس‌ها ایجاد شود، فراخوانی می‌شود.

هدف constructorها مقدار‌دهی اولیه به اعضای کلاس در هنگام ایجاد شدن کلاس است. Constructorها هیچ مقدار بازگشتی ندارند و نام آن‌ها هر چه که باشد همیشه پسوند Class را دارد. لیست ۱-۷ مثالی از یک کلاس است.

لیست ۱-۷. مثال کلاس‌های سی شارپ: Classes.cs

// Namespace تعریف
using System;

//  کلاس کمک کننده
class OutputClass 
{
    string myString;

    // Constructor
    public OutputClass(string inputString) 
    {
        myString = inputString;
    }

    // Instance متد
    public void printString() 
    {
        Console.WriteLine("{0}", myString);
    }

    // Destructor
    ~OutputClass() 
    {
        // چند رویه پاکسازی منبع
    }
}

// کلاس آغاز برنامه
class ExampleClass 
{
    //اجرای برنامه را آغاز می‌کند Main متد
    public static void Main() 
    {
        // Instance of OutputClass
        OutputClass outCl = new OutputClass("This is printed by the output class.");

        // Output فراخوانی متد کلاس
        outCl.printString(); 
    }
}

لیست ۱-۷ دو کلاس را نشان می‌دهد. کلاس بالایی، یعنی OutputClass، دارای یک constructor، متد instance و یک Destructor است. همچنین دارای فیلدی به نام myString است. توجه کنید که constructor یا سازنده OutputClass چگونه برای مقداردهی اولیه به اعضای داده‌ای کلاس استفاده شده است.

در این مثال، سازنده OutoutClass یک آرگومان از نوع رشته به نام inputString می‌پذیرد. این رشته در فیلد myString کپی می‌شود.

همان‌طور که در ExampleClass نشان داده شده است، استفاده از constructorها اجباری نیست. در این مثال، یک constructor پیش‌فرض فراهم شده است. Constructor پیش‌فرض به زبان ساده، یک constructor بدون آرگومان است.

به هر حال، یک constructor بدون آرگومان همیشه هم مفید نیست. برای اینکه constructorهای پیش‌فرض مفید واقع شوند، می‌توانید آن‌ها را با مقدار دهنده‌ها پیاده‌سازی کنید. در زیر یک مثال مشاهده می‌کنید:

    public OutputClass() : this("Default Constructor String") { }

تصور کنید که این constructor در لیست ۱-۷ در کلاس OutputClass قرار می‌داشت. در ادامه این constructor پیش‌فرض یک مقدار دهنده آمده است. عملگر دو نقطه (:) نشان دهنده نقطه شروع مقدار دهنده است که بعد از آن کلیدواژه this قرار گرفته است. کلیدواژه this به یک شیء به خصوص اشاره می‌کند.

این کد به صورت موثر و خوب، یک constructor از شیء مشابه با آنچه در این کد تعریف شده است را فراخوانی می‌کند. بعد از کلیدواژه this یک لیست پارامتر همراه با یک رشته(string) قرار گرفته است.

عملی که توسط مقدار دهنده بالا انجام شده است، فراخوانی constructor کلاس OutputClass است که یک نوع String را به عنوان آرگومان دریافت می‌کند. مقدار دهنده به شما کمک می‌کند تا اطمینان حاصل کنید که فیلد‌های کلاس شما در هنگامی که از کلاس instance ساخته می‌شود، مقداردهی اولیه شوند.

مثال بالا نشان می‌دهد که چگونه یک کلاس می‌تواند چندین constructor داشته باشد. Constructorخاصی که فراخوانی می‌شود، به تعداد پارامترها و نوع هر پارامتر بستگی دارد.

در #C، دو نوع اعضای کلاس وجود دارند، instance و Static. اعضای کلاس instance به یک رویداد خاص از یک کلاس تعلق دارند. هر دفعه که شما یک شیء از یک کلاس خاص تعریف می‌کنید، در واقع یک  instance جدید از آن کلاس ایجاد می‌کنید.

متد ()Main در کلاس ExampleClass یک instance از کلاس OutputClass به نام outCl ایجاد می‌کند. می‌توانید از کلاس OutputClass چند instance با نام‌های مختلف ایجاد کنید. هر کدام از این instanceها از یکدیگر مجزا و مخصوص به خود هستند. برای مثال، اگر دو instance از OutputClass به شکل زیر ایجاد کنید:

  OutputClass oc1 = new OutputClass("OutputClass1");
    OutputClass oc2 = new OutputClass("OutputClass2");

در واقع دو instance مجزا از OutputClass با فیلد‌های myString مجزا و متدهای ()printString مجزا ایجاد کرده‌اید. از طرف دیگر، اگر عضو کلاس static باشد، می‌توانید خیلی راحت با استفاده از این syntax به آن دسترسی داشته باشید:

<کلاس static عضو>.<نام کلاس>

نام instanceها oc1 و oc2 است.

فرض کنید کلاس OutputClass دارای متد static‌زیر باشد:

public static void staticPrinter() 
    {
        Console.WriteLine("There is only one of me.");
    }

پس می‌توانید آن تابع را از متد ()Main به شکل زیر فراخوانی کنید:

    OutputClass.staticPrinter();

شما باید اعضای کلاس static را از طریق نام کلاس آن‌ها (نه از طریق نام instance) فراخوانی کنید. این بدان معنا است که لازم نیست برای استفاده از اعضای static یک کلاس، از آن کلاس یک instance بسازید. فقط یک کپی از عضو static کلاس وجود دارد.

یکی از استفاده‌های خوب اعضای static زمانی است که یک تابع باید اجرا شود و هیچ عملیات واسطی (مانند محاسبات ریاضی) وجود ندارد. در واقع، کتابخانه کلاس پایه NET Framework. شامل یک کلاس Math (ریاضی) است که به صورت وسیع از اعضای Static استفاده می‌کند.

نوع دیگر از سازنده‌ها، constructor static است. از constructor static برای مقداردهی اولیه به فیلدهای static در یک کلاس استفاده می‌شود. می‌توانید با استفاده از کلیدواژه Static در قبل از نام constructor آن را تعریف کنید.

یک static constructor قبل از اینکه یک instance از یک کلاس ایجاد شود، قبل از اینکه یک عضو Static فراخوانی شود و قبل از اینکه static constructor از یک کلاس گرفته شود(این مبحث در جلسات بعدی توضیح داده خواهد شد)، فراخوانی می‌شود. سازنده‌های Static فقط یک بار فراخوانی می‌شوند.

OutputClass همچنین دارای یک destructor(تابع مخرب) است. Destructorها دقیقا شبیه به constructorها هستند. با این تفاوت که destructorها یک تیلد (‌~) در ابتدای کدشان دارند.

آن‌ها هیچ پارامتری نمی‌گیرند و هیچ مقداری بازنمی‌گردانند. وقتی destructorها استفاده می‌شوند، برنامه یا کد، همه منابع کلاس را که در طول چرخه عمر کلاس نگه داشته شده بودند را رها یا آزاد می‌کند.

destructorها معمولا وقتی فراخوانی می‌شوند که برنامه بازیافت حافظه (Garbage Collector) زبان #C تصمیم می‌گیرد شیء شما را از حافظه حذف کند.

نکته: احتمالا متوجه شده‌اید که استفاده از سطح دسترسی public به این معنا است که می‌توان از یک کلاس به اعضای کلاس دیگر دسترسی داشت. وقتی از public در یک کلاس استفاده می‌کنید، بدین معنا است که آن کلاس توسط DLLهای خارج از فایل اسمبلی(که معمولا یک فایل .exe یا .dll هستند) قابل دسترسی است.

در جلسه نوزدهم مفصل در مورد سطوح دسترسی صحبت خواهیم کرد.

تا اینجا، تنها اعضای کلاسی که مشاهده کرده‌اید عبارت بودند از فیلدها، متدها، constructorها و destructor ها. در زیر لیستی کاملی از انواع اعضایی که می‌توانید در کلاس‌های خود داشته باشید را مشاهده می‌کنید:

  • Constructorها
  • Destructorها
  • فیلدها
  • متدها
  • خواص کلاس
  • شاخص‌ها
  • Delegateها(نماینده‌ها)
  • رویدادها
  • کلاس‌های تو در تو

در این جلسه در مورد همه موارد بالا صحبت نشد، اما در جلسات بعدی این دوره حتما همه آن‌ها معرفی خواهند شد.

خلاصه

آموختید که چگونه می‌توان constructorهای instance و Static تعریف کرد. همچنین یاد گرفتید که چگونه فیلدهای کلاس را مقداردهی کنید. وقتی نیازی به مقداردهی یک شیء نیست، می‌توانید اعضای کلاس static ایجاد کنید. همچنین می‌توانید برای حذف منابع از Destructorها استفاده کنید.

منبع: C#-Station

جلسه بعد                                                                جلسه قبل

 مطالب مرتبط

 مقدمه ای بر زبان برنامه نویسی #C و پلتفرم NET Framework.
7 دلیل منطقی برای آموختن #C
 طبقه بندی زبان های برنامه نویسی
به دست آوردن Exceptionها در #C و یافتن همه خطاها
 LINQ(زبان جستجوی یکپارچه)
برنامه نویسی شیءگرا چیست؟

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامع SQL Server (جلسه ۱۲)
آموزش جامع SQL Server (جلسه ۱۲)

دستور UPDATE در SQL Server برای تغییر داده‌های موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

آموزش جامع SQL Server (جلسه ۱۵)
آموزش جامع SQL Server (جلسه ۱۵)

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفاده‌ای ندارد را حذف کنید. برای ...

آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)
آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...

آخرین دیدگاه ها

دیدگاه خود را درباره این پست بنویسید

فرم ارسال نظرات