مقدمه ساده برای درک مفهوم کلاس :
امروز میخوایم با یه چیز جالب توی برنامهنویسی سیشارپ آشنا بشیم:
کلاس : کلاس مثل یه نقشه یا طرح اولیهست که به ما کمک میکنه چیزهایی که توی برنامهمون نیاز داریم رو بسازیم. مثلاً فکر کنید یه کلاس مثل یه قالب کیکه؛ با اون قالب میتونید کلی کیک درست کنید که همشون شکلشون شبیه همه، ولی مواد داخلشون میتونه فرق داشته باشه. توی این درس، یه کلاس ساده درست میکنیم و یه کم راجع به اینکه چه جوری میشه بهش دسترسی داشت حرف میزنیم.
توضیح کلاس و سطوح دسترسی :
کلاس توی سیشارپ یه جور جعبهست که میتونیم توش اطلاعات (مثل اسم یا سن یا تاریخ و هر چیز دیگه) و یا کارهایی که میخوایم انجام بدیم (مثل سلام کردن یا محاسبه چند عبارت ریاضی و یا انجام یک کار روی فرم و هر کاری که می تونید تصور کنید) رو بذاریم. فرض کنید میخوایم یه کلاس برای "دانشآموز" درست کنیم. این کلاس میتونه اطلاعاتی مثل اسم و سن داشته باشه و کاری مثل گفتن "سلام" رو انجام بده. به این شکل:
internal class Student
{
string name = " " علی ; یه اطلاعات //
int age = 15; // یه اطلاعات دیگه
void SayHello() // یه کار که کلاس میتونه بکنه
{
Console.WriteLine("سلام ، من " + name + " هستم! ");
}
}
اینجا Student یه کلاسه که نقشه ی یه دانشآموزه. حالا اگه بخوایم ازش استفاده کنیم، باید یه دانشآموز واقعی از روش بسازیم که بهش میگیم شیء یا Object
حالا بریم سراغ سطوح دسترسی. اینها مثل قفل در خونهاند که میگن کی میتونه وارد بشه و کی نمی تونه. توی سیشارپ، ما میتونیم با چند کلمه مشخص کنیم کلاسمون چه جوری دیده بشه. دو تا از مهمترینشون ایناس:
public اگه بنویسیم public class Student، یعنی همه میتونن از این کلاس استفاده کنن، حتی از جاهای دیگه توی برنامهمون. مثل اینه که در خونهتون همیشه باز باشه و هرکی بخواد بیاد داخل.
internal یعنی فقط کسایی که توی همون پروژه یا "خونه" هستن میتونن ازش استفاده کنن، و غریبهها نمیتونن بیان داخل. همآنطور که در مثال بالا می بینید کلاس با سطح دسترسی internal تعریف شده در چنین حالتی در صورتی که مایل باشید می توانید از نوشتن این کلمه صرفنظر کنید زیرا سی شارپ بطور پیشفرض کلاسی را که برایش سطح دسترسی تعیین نشده آن را internal در نظر می گیرد .
یه مثال سادهتر: فکر کنید کلاس Student مثل یه کتابخونهست که داخل کلاس ماست اگه public باشه، همه دانشآموزای مدرسه میتونن بیان و کتاب بگیرن. اما اگه internal باشه، فقط بچههای کلاس خودمون میتونن ازش استفاده کنن. اگه بخوایم چیزایی داخل کلاس (مثل اسم یا سن) رو قفل کنیم که فقط خود کلاس بتونه باهاشون کار کنه، از private استفاده میکنیم.
بیائید مثال کتابخونه رو کمی بیشتر باز کنیم و تا جایی که امکان دارد سطوح دسترسی را با این مثال توضیح دهیم.
فکر کنید یه کتابخونه داریم که پر از کتابهای مختلفه. این کتابخونه مثل یه کلاس توی سیشارپه که میتونه چیزایی مثل کتاب (اطلاعات) و کارایی مثل امانت دادن (متدها) رو داشته باشه . حالا اینکه کی بتونه بیاد از این کتابخونه استفاده کنه، بستگی داره به اینکه درش رو چه جوری قفل کنیم. توی سیشارپ به این قفلها میگیم سطوح دسترسی. بیاید با مثال کتابخونه ببینیم این سطوح چیان!
فرض کنیم کتابخونهمون یه اسم داره، مثلاً Library، و توی یه پروژه سیشارپ تعریفش کردیم. حالا میخوایم ببینیم چه کسایی میتونن بیان داخلش:
public عمومی اگه بگیم public class Library, یعنی در کتابخونه برای همه بازه! هر دانشآموزی از هر مدرسهای توی شهر، حتی اگه از یه جای دیگه باشه، میتونه بیاد و کتاب بگیره. مثلاً:
public class Library
{
string book = "داستانهای خوب";
void LendBook()
{
Console.WriteLine("کتاب امانت داده شد!");
}
}
اینجا همه میتونن از کتابخونه استفاده کنن، حتی اگه توی یه پروژه دیگه باشن (مثلاً یه برنامه جداگانه).
internal یا داخلی : اگه چیزی ننویسیم، مثل class Library, سیشارپ خودش اون رو internal میکنه. یعنی فقط کسایی که توی همون مدرسه (یا همون پروژه) هستن میتونن بیان داخل. مثلاً:
class Library
{
string book = "ریاضی آسون";
}
توی این حالت، فقط دانشآموزای مدرسهای که کتابخونه توش ساخته شده میتونن ازش استفاده کنن. اگه یه مدرسه دیگه بخواد بیاد، در قفله و نمیتونه!
private خصوصی : حالا اگه بخوایم چیزایی توی کتابخونه رو قفل کنیم (مثل کتابها یا کارهاش)، از private استفاده میکنیم.
توجه کنید که این سطح برای خود کلاس نیست، بلکه برای چیزای داخلش (مثل متدها یا متغیرها) استفاده میشه. مثلاً:
public class Library
{
private string secretBook = "گنج مخفی"; // فقط خود کتابخونه میتونه ببینه
public string normalBook = "داستان ساده"; // همه میتونن ببینن
}
اینجا secretBook مثل یه کتاب توی گاوصندوق کتابخونهست که فقط مسئول کتابخونه (یعنی خود کلاس) میتونه بهش دست بزنه، ولی normalBook برای همه آزاده.
protected محافظتشده
این یه کم خاصتره. فرض کنید کتابخونه یه بخش ویژه داره که فقط برای کسایی که از خانواده کتابخونه باشن (مثلاً کلاسهای فرزند) بازه. مثلاً:
public class Library
{
protected string familyBook = "کتاب خانوادگی";
}
public class SpecialLibrary : Library
{
void CheckBook()
{
Console.WriteLine(familyBook); // فقط اینجا میتونه ببینه
}
}
اینجا familyBook فقط برای کلاسهایی که از Library ارث میبرن مثل SpecialLibrary قابل دسترسیه، نه برای بقیه.
جمعبندی :
اگه کتابخونه public باشه، همه بچههای شهر میتونن بیان و کتاب بگیرن.
اگه internal باشه، فقط بچههای همون مدرسهای که کتابخونه توشه میتونن بیان.
اگه یه کتاب داخلش private باشه، فقط مسئول کتابخونه میتونه بهش دست بزنه.
اگه protected باشه، فقط مدرسههایی که شعبه اون کتابخونهان میتونن به بخش ویژهش دسترسی داشته باشن.