مقدماتی بر کلاس ها در #C

یکی از نوع های مهم در #C کلاس ها می باشند که در این مطلب به صورت مقدماتی با آنها آشنا می شویم.
قبل از روزها تجزیه و تحلیل و طراحی شی گرا ، برنامه نویسان یک برنامه را فقط دنباله ای از دستورالعمل ها تصور می کردند ، با ظهور الگوی شی گرایی ، داده ها و توابع به صورت مجموعه های کپسوله سازی شده در آمدند و “کلاس” نامگذاری شدند.
“کپسوله سازی، مخفیسازی (Encapsulation)، به این مفهوم اشاره دارد که باید بعضی خصوصیات یا رفتارهای شیء را از دید دیگران پنهان کرد. فرض کنید شما به عنوان یک راننده میخواهید اتومبیل شخصی تان را روشن کنید و به محل کارتان عزیمت کنید سوییچ را برمیدارید، استارت میزنید و با فشار آوردن به پدالهای گاز و ترمز و چرخش فرمان و … به محل کارتان خواهید رسید. در طول این مسیر در اتومبیل شما به عنوان یک شیء اعمال مختلفی در حال انجام بود. مثلاً لنت ترمز به دیسک چرخ برخورد میکرد و باعث کم شدن سرعت میشد یا شمعها شروع به جرقه زدن در زمانی بخصوصی میکردند. حال فرض کنید که عمل مخفیسازی وجود نداشت و شما مجبور بودید که جرقه زدن شمعها را کنترل میکردید و به سیستم سوخترسانی در موقع لزوم دستور میدادید که سوخت را بداخل سیلندرها ارسال کند و غیره یا هیچگاه به مقصد نمیرسیدید. یا سالم نمیرسیدید. عمل مخفیسازی باعث میشود که اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند.”
کلاس یک ساختار داده است که می تواند داده ها و کدهای اجرایی را در خود نگهدارد پس اعضای آن میتوانند به دو دسته زیر تقسیم شوندکه در مورد همه آنها صحبت خواهبم کرد :
Data Members Store Data
- Fields
- Constants
Function Members Execute Code
- Methods
- Properties
- Constructors
- Destructors
- Operators
- Indexers
- Events
یک نمونه برای آشنایی با مفهوم کلاس
برنامه در حال اجرا در #C شامل گروهی از اشیا با نوع های مختلف می باشد که اکثر آنها نمونه هایی از کلاس های موجود در برنامه هستند.
به عنوان مثال ، فرض کنید شما برنامه ی بازی معروف Super Mario (قارچ خور) را دارید. هنگامی که این بازی در حال اجرا است ، ممکن است نمونه ای از یک کلاس برای شخصیت اول بازی که توسط بازی کن کنترل می شود و از بازیکن فرمان میگیرد ، و چندین نمونه از یک کلاس برای شخصیت های دشمن ، گلها و سایر کاراکتر های بازی ایجاد شده باشند.

تعریف یک کلاس
اگرچه انواع int ، double و char در زبان #C تعریف شده اند ، اما کلاسهایی مانند شخصیت Super Mario ، همانطور که احتمالاً حدس می زنید ، توسط زبان تعریف نشده اند. اگر می خواهید از آنها در برنامه ای استفاده کنید ، باید خودتان آنها را تعریف کنید. این کار را با تعریف یک کلاس انجام می دهیم . تعریف یک کلاس فقط ویژگی ها و اعضای کلاس جدید را مشخص می کند و نمی تواند نمونه ای از کلاس را ایجاد کند.تعریف یک کلاس الگویی را ایجاد می کند که نمونه های کلاس از آن ایجاد می شود.
برای مثال در تعریف کلاس یک شخصیت بازی میتوانیم مشخص کنیم که این کلاس ویژگی هایی مانند رنگ ، اندازه و … داشته باشد.
کد زیر ساده ترین حالت یک کلاس نوشته شده را نشان میدهد :
class MyClass
{
//Member Declarations
}
اعضای کلاس :فیلدها
کد زیر یک کلاس ساده برای شخصیت بازی Super Mario را نشان می دهد :
class SuperMario
{
// Fields
int Width;
int Height;
string color;
//Methods
void Run()
{
//کدهای مربوط به دویدن شخصیت
}
}
در مثال بالا سه فیلد در کلاس تعریف شد ، توجه داشته باشید که هیچکدام از فیلدها مقداردهی نشده اند پس فیلدهای از نوع int به صورت پیش فرض 0 و فیلد رنگ که از نوع String می باشد به علت reference type بودن null در نظر گرفته می شود.
اعضای کلاس :متدها
متد شامل مجموعه از کدهای اجرایی در داخل یک بلوک می باشد که می تواند از قسمت های مختلف برنامه فراخوانی شود .
وقتی متدی فراخوانی می شود ، کد داخلش اجرا می شود و سپس به کدی که متد توسط آن فراخوانی شده بود برمی گردد و به اجرای خود ادامه می دهد.
به عنوان مثال ، کد زیر یک کلاس را با یک متد ساده به نام PrintNums اعلام می کند. از طریق این کد ، می توانیم موارد زیر را درباره متد PrintNums بگوییم :
- از نوع بازگشتی void زمانی که نیاز به خروجی مقدار از متد نباشد استفاده می شود
- این متد شامل هیچ پارامتر ورودی نمی باشد
- این متد دارای دو خط کد می باشد که یکی عدد 1 و دیگری 2 را چاپ می کند
class SimpleClass
{
void PrintNums()
{
Console.WriteLine("1");
Console.WriteLine("2");
}
}
ایجاد متغیرها و نمونه های یک کلاس
تعریف کلاس فقط طرحی است که نمونه هایی از کلاس از آن ایجاد می شوند. پس از تعریف کلاس ، می توانید نمونه هایی از کلاس ایجاد کنید.
کلاسها reference type هستند یعنی ، آنها برای مراجعه به داده های واقعی به حافظه نیاز دارند.
ارجاع به داده ها در یک متغیر از نوع کلاس ذخیره می شود. بنابراین ، برای ایجاد نمونه ای از کلاس ، باید با اعلام متغیر از نوع کلاس شروع کنید. اگر متغیر مقداردهی نشده باشد ، مقدار آن تعریف نشده است و به آدرس حافظه ی اشاره نمی کند که در آن مقداری وجود داشته باشد.
در کد نوشته شده در داخل تصویر پایین مشاهده می کنید که داخل تابع Main برنامه کلاس superMario تعریف شده است ولی مقدار دهی اولیه نشده است و همانطور که در سمت راست تصویر نشان داده شده است ، این متغیر به هیچ آدرس خانه ای که مقداری داخل آن وجود داشته باشد اشاره نمی کند.

اختصاص حافظه برای داده ها
جهت اختصاص حافظه برای داده های واقعی ، از عملگر new استفاده می شود.
با استفاده از کلمه کلیدی new می توان برای نمونه های ایجاد شده از نوع های خاص حافظه تخصیص داد و آن ها را مقدار دهی اولیه کرد.
در کد پایین چگونگی تعربف یک کلاس و ایجاد نمونه ای از کلاس نمایش داده شده است.
SuperMariosuperMario ; // ایجاد متغیر برای مرجع
superMario = new SuperMario(); // اختصاص حافظه برای شی کلاس و مقداردهی آن
البته می توان آن را در یک سطر به صورت زیر نوشت :
SuperMario superMario = new SuperMario(); // تعربف و مقداردهی
در شکل زیر نحوه تعریف و مقدار دهی یک نمونه از یک کلاس را می توانید مشاهده کنید :

اعضای نمونه سازی شده
تعریف یک کلاس به عنوان یک الگوی اصلی عمل می کند که از آن می توانید به تعداد دلخواه نمونه ی کلاس ایجاد کنید.
هر نمونه از یک کلاس ، شی ای جداگانه ای است که اطلاعات و رفتارهای خاص خود را دارد.
برای مثال یک کلاس به صورت زیر داریم :
class Car
{
public string PlateNumber;
public string Color;
public string Name;
}
و کلاس را داخل متد Main به صورت زیر تعریف کرده ایم :
class Program
{
static void Main(string[] args)
{
//تعریف کلاس
Car myCar;
}
}
متغیر myCar به هیچ خودرو خاصی اشاره نمی کند و کلمه new است که مانند خط تولید یک کارخانه خودرو سازی می تواند یک یا چند نمونه خودرو با رنگ و ویژگی های خاص دیگر تولید کند.دقت داشته باشید که یک خودرو وقتی قابل استفاده است که تولید شده باشد.
class Program
{
static void Main(string[] args)
{
Car myCar = new Car();
Car yourCar = new Car();
Car myBrothereCar = new Car();
myCar.Color = "آبی";
myCar.PlateNumber = "123456";
myCar.Name = "پژو";
yourCar.Color = "قرمز";
yourCar.PlateNumber = "124578";
yourCar.Name = "پژو";
myBrothereCar.Color = "سفید";
myBrothereCar.PlateNumber = "159753";
myBrothereCar.Name = "پژو";
}
}
class Car
{
public string PlateNumber;
public string Color;
public string Name;
}

Access Modifiers
Access Modifier که در فارسی به اصلاح کننده دسترسی یا تغییر دهنده دسترسی معروف است این امکان را فراهم می کند که بتوانیم برای اعضای کلاس محدودیت دسترسی به وجود بیاوریم، به صورت پیش فرض اعضای کلاس در داخل کلاس به یکدیگر دسترسی دارند ولی ممکن است که تصمیم بگیریم این دسترسی ها را تغییر دهیم.
برای مثال در کد پایین دسترسی برای فیلد و تابع نشان داده شده :
AccessModifier Type Identifier ک
//Methods
AccessModifier ReturnType MethodName ()
{
//...
}
Access Modifier های #C به شرح زیر می باشند. ما دو مورد اول را اکنون و موارد دیگر را در مطالب آینده شرح خواهیم داد :
• Private
• Public
• Protected
• Internal
• Protected internal
دسترسی Private و Public :
اعضای private (خصوصی) فقط از داخل کلاسی که در آن فرار دارند قابل استفاده هستند و سایر کلاس ها به آنها دسترسی نخواهند داشت.
- وضعیت دسترسی اعضای داخل یک کلاس به صورت پیشفرض private می باشد یعنی هنگام تعریف عضو اگر هیچ دسترسی برای یک عضو قرار ندهیم دسترسی آن private خواهد بود.
- دقت داشته باشید که دسترسی private را برای یک عضو را هم می توانیم به صورت ضمنی و هم به صورت صریح مشخص کرد.
int MyInt1; // ضمنی
private int MyInt2; // صریح
اعضای public (عمومی) برای نمونه های ایجاد شده در سایر کلاس های موجود در برنامه قابل دسترسی هستند. برای تعیین دسترسی عمومی باید از public استفاده کنید.
public int MyInt;
public و private را می توانیم به صورت زیر تصور کنیم :

اعضای public تا حدی به خارج از جعبه کلاس خود چسبیده اند و اعضای private کاملا در داخل کلاس قرار گرفته اند.
دیدگاهتان را بنویسید