درس هفتم – آشنایی با کلاسها در C#
در این درس با کلاسها در زبان C# آشنا خواهید شد. اهداف این درس به شرح زیر میباشند :
ü پیادهسازی سازندهها (Constructors)
ü درک تفاوت بین اعضای نمونه (Instance) و استاتیک (Static)
ü آشنایی با تخریب کنندهها (Destructors)
ü آشنایی با اعضای کلاسها
در تمامی مطالبی که در این سایت مشاهده کردهاید، برنامهها دارای کلاسهایی بودهاند. در حال حاضر باید درک نسبی از کلاسها و کار آنها و چگونگی ایجاد آنها داشته باشید. در این درس مروری بر آموختههای قبلی از کلاسها خواهیم کرد و نیز با اعضای کلاسها آشنا میشویم.
یک کلاس با استفاده از کلمه کلیدی class که بدنبال آن نام کلاس آمده باشد، اعلان میگردد و اعضای این کلاس درون {} اعلان میگردند. هر کلاس دارای سازندهای میباشد که در هربار ایجاد نمونهای جدید از آن کلاس، بصورت خودکار فراخوانی میگردد. هدف از سازنده، تخصیصدهی اعضای کلاس در زمان ایجاد نمونهای جدید از کلاس است. سازندهها دارای مقادیر بازگشتی نبوده و همواره نامی مشابه نام کلاس دارند. مثال 1-7 نمونهای از یک کلاس را نشان میدهد.
// 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();
}
}
در مثال 1-7 دو کلاس دیده میشوند. کلاس بالایی، کلاس OutPutClass، دارای سازنده، متد نمونه و یک تخریب کننده است. همچنین این کلاس دارای فیلدی با نام myString است. توجه نمایید که چگونه سازنده این کلاس اعضای آنرا تخصیصدهی(مقداردهی) مینماید. در این مثال، سازنده کلاس رشته ورودی (inputString) را بعنوان آرگومان خود دریافت مینماید. سپس این مقدار داخل فیلد کلاس یعنی myString کپی میگردد.
همانطور که در ExampleClass مشاهده مینمایید، استفاده از سازنده الزامی نمیباشد. در این مورد سازنده پیش فرض ایجاد میگردد. سازنده پیش فرض، سازندهای بدون هیچ نوع آرگومانی است. البته شایان ذکر است که سازندههاییی بدون آرگومان همیشه مورد استفاده نبوده و مفید نیستند. جهت کارآمد کردن بیشتر سازندههای بدون آرگومان بهتر است آنها را با تخصیصدهنده (Initializers) پیادهسازی نمایید. به مثال زیر در این زمینه توجه نمایید :
public OutputClass() : this("Default Constructor String") { }
فرض کنید این عبارت در کلاس OutPutClass در مثال 1-7 قرار داشت. این سازنده پیش فرض به یک تخصیصدهنده همراه شده است. ":" ابتدای تخصیصدهنده را مشخص مینماید، و به دنبال آن کلمه کلیدی this آمده است. کلمه کلیدی this به شیء کنونی اشاره مینماید. استفاده از این کلمه، فراخوانی به سازنده شیء کنونی که در آن تعریف شده است، ایجاد میکند. بعد از کلمه کلیدی this لیست پارامترها قرار میگیرد که در اینجا یک رشته است. عملی که تخصیصدهنده فوق انجام میدهد، باعث میشود تا سازنده OutPutClass رشتهای را بعنوان آرگومان دریافت نماید. استفاده از تخصیصدهندهها تضمین مینمایند که فیلدهای کلاس شما در هنگام ایجاد نمونهای جدید مقداردهی میشوند.
مثال فوق نشان داد که چگونه یک کلاس میتواند سازندههای متفاوتی داشته باشد. سازندهای که فراخوانی میشود، به تعداد و نوع آرگومانهایش وابسته است.
در زبان C#، اعضای کلاسها دو نوع میباشند : اعضای نمونه و استاتیک. اعضای نمونه کلاس متعلق به رخداد خاصی از کلاس هستند. هربار که شیای از کلاسی خاص ایجاد میکنید، در حقیقت نمونه جدیدی از آن کلاس ایجاد کردهاید. متد Main() در کلاس ExampleClass نمونه جدیدی از OutPutClass را تحت نام outCl ایجاد مینماید. میتوان نمونههای متفاوتی از کلاس OutPutClass را با نامهای مختلف ایجاد نمود. هر یک از این نمونههای مجزا بوده و به تنهایی عمل میکنند. به عنوان مثال اگر دو نمونه از کلاس OutPutClass همانند زیر ایجاد نمایید :
OutputClass oc1 = new OutputClass("OutputClass1");
OutputClass oc2 = new OutputClass("OutputClass2");
با این اعلان، شما دو نمونه از کلاس OutPutClass را ایجاد کردهاید که یک از آنها دارای فیلد myString و متد printString() هستند و این فیلدها و متدها کاملاً از یکدیگر مجزا میباشند. به بیان دیگر درصورتیکه عضوی از کلاس استاتیک باشد از طریق ساختار نوشتاری
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
مواردی که در این درس با آنها آشنا نشدید، حتماً در درسهای آینده مورد بررسی قرار خواهند گرفت.
خلاصه
در این درس نحوه اعلان سازندههای استاتیک و نمونه را فرا گرفتید و با نحوه مقداردهی به فیلدها آشنا شدید. زمانیکه نیاز به ایجاد نمونه از روی شیء نباشد از اعضای استاتیک کلاس استفاده میکنیم. با استفاده از تخریبکنندهها میتوانید منابع بلا استفاده را به سیستم باز گردانید.