در این پست میخواهیم یاد بگیریم یک کلاس ساده بسازیم و ازش استفاده کنیم؛ کلاسی که تقریباً چیزهای مهم و اصلی یک کلاس رو داشته باشه. بیایید با یه مثال شروع کنیم و خط به خط اون رو توضیح بدیم تا برای کسایی که تازه برنامهنویسی رو شروع کردن، همه چیز روشن بشه.
فرض کنید میخواهیم یه کلاس به اسم Student بسازیم. کدش اینجوریه:
public class Student
{
private string Name { get; set; }
}
public Student(string name)
{
Name = name;
}
public string Introduce()
{
return $"سلام، من {Name} هستم.";
}
}
هر چیزی که به کلاس مربوط میشه، باید بین دو آکولاد {} نوشته بشه. حالا بیایم خط به خط این کد رو توضیح بدیم:
تعریف کلاس:
public class Student
اینجا داریم میگیم که میخواهیم یه کلاس به اسم Student بسازیم. کلمه public یعنی این کلاس از جاهای دیگه توی برنامه قابل دسترسه. کلاس مثل یه نقشه یا قالب میمونه که ما ازش برای ساختن چیزهای مشخص (مثل یه دانشجو با اسم خاص) استفاده میکنیم.
متغیر خصوصی:
private string Name { get; set; }
توی این خط، یه متغیر به اسم Name تعریف کردیم که از نوع رشته (string) هست. کلمه private یعنی این متغیر فقط داخل همین کلاس قابل دسترسی است .. { get; set; } هم به ما اجازه میده که از داخل کلاس، مقدار این متغیر رو بخونیم یا تغییر بدیم.
سازنده کلاس:
public Student(string name)
{
Name = name;
}
این قسمت که بهش سازنده میگن موقع نمونه سازی از کلاس ، صدا زده میشه تا همه چیز رو فراهم کنه یکی از کارهایی که این سازنده انجام میده اینه که متغیر Name رو با اسمی که ما میدیم پر میکنه. مثلاً اگه بنویسیم.
Student s = new Student("رضا");
متغیر Name میشه " رضا " .
تابع Introduce (معرفی) :
public string Introduce()
{
return $"سلام، من {Name} هستم.";
}
این یه تابع عمومیه که ما پس از نمونه سازی از کلاس می تونیم با کمک نام کلاس نمونه به این متد دسترسی داشته باشیم و اون رو اصطلاحا صداش کنیم. وقتی این تابع اجرا بشه ، یه جمله مثل "سلام، من رضا هستم" به ما برمیگردونه. .
چرا متغیر Name رو خصوصی کردیم؟
اگه Name رو بجای private با public تعریف می کردیم ، هر کسی از بیرون کلاس می تونست مستقیم بیاد و مقدارش رو عوض کنه ، مثلا بنویسه
Student.Name = "Reza"
ولی حالا که خصوصی تعریفش کردیم، فقط از داخل کلاس و از طریق تابعهایی که خودمون مینویسیم میشه بهش دسترسی داشت یا تغییرش داد. به این کار میگن کپسوله کردن، یعنی اطلاعات رو توی کلاس محافظت میکنیم و جل تغییرات ناخواسته رو می گیریم .
مثلاً اگه بخوایم یه قانون بذاریم که اسم حتماً چه خصوصیاتی داشته باشه می تونیم با شرط قرار دادن آن اسم ها را کنترل کنیم.
فرض کنید میخواهیم توی برنامهمون از این کلاس استفاده کنیم. میتونیم اینجوری بنویسیم:
Student student1 = new Student("رضا");
Console.WriteLine(student1.Introduce());
خروجی این کد میشه: سلام، من رضا هستم.
چرا این کار مهمه؟
کلاس مثل یه جعبهست که هم اطلاعات (مثل اسم دانشجو) رو نگه میداره و هم کارهایی که میتونیم باهاش انجام بدیم (مثل معرفی کردن). با خصوصی کردن متغیرها و استفاده از تابعها، ما مطمئن میشیم که همه چیز توی برنامهمون منظم و قابل کنترله. این روش باعث میشه برنامههامون وقتی بزرگتر میشن، راحتتر مدیریت بشن و کمتر خطا داشته باشن.
به همین سادگی! حالا یه کلاس ساده ساختیم و میتونیم ازش برای چیزهای پیچیدهتر استفاده کنید.
ارتباط بین فرم و کلاس با استفاده از Property
فرض کنید برنامهای دارید که در آن، وضعیت یک چکباکس (CheckBox) تعیین میکند که کدام بخش از کد در کلاس شما اجرا شود. به طور مستقیم نمیتوانید از داخل کلاس به کنترلهای موجود در فرم دسترسی داشته باشید.
در این آموزش، یاد میگیریم چگونه وضعیت یک چکباکس را از فرم به یک کلاس منتقل کنیم و بر اساس آن، منطق برنامه را در کلاس تغییر دهیم.
برای این کار، در کلاس خود یک Property ایجاد میکنیم. این Property به عنوان یک رابط بین فرم و کلاس عمل میکند. فرم میتواند مقدار این Property را true یا false تعیین کند و کلاس میتواند بر اساس این مقدار، تصمیمگیری کند.
در کلاس، یک فیلد از نوع `bool` برای ذخیره وضعیت چکباکس و یک متد برای برگرداندن وضعیت به صورت رشتهای خواهیم داشت.
در ادامه، ابتدا کد کلاس و سپس نحوه استفاده از آن را مشاهده میکنید.
کد کلاس:
public bool IsChecked // Property برای دریافت و تنظیم وضعیت چکباکس
{
get { return _isChecked; }
set { _isChecked = value; }
}
public string GetStatusText() // متد برای برگرداندن وضعیت به صورت متن
{
if (_isChecked)
{
return "تیک خورده";
}
else
{
return "تیک نخورده";
}
}
}
نحوه استفاده از کلاس در رویداد کلیک یک دکمه (Button) با فرض وجود یک چکباکس (CheckBox) روی فرم:
// تنظیم مقدار Property با استفاده از وضعیت چکباکس
testClass.IsChecked = checkBox1.Checked;
// استفاده از متد برای نمایش وضعیت چکباکس
label1.Text = testClass.GetStatusText();
}
توضیحات :
ابتدا نمونه ای از کلاس MyClass ایجاد میکنیم. سپس، با استفاده از پراپرتی IsChecked، وضعیت چکباکس را به کلاس منتقل میکنیم. از این به بعد، کلاس میتواند با استفاده از فیلد _isChecked به وضعیت چکباکس دسترسی داشته باشد.
برای بررسی صحت عملکرد کد، میتوانیم از متد GetStatusText استفاده کرده و وضعیت چکباکس را در یک Label نمایش دهیم.
برنامه نویسی شی گرا (OOP) Object-Oriented Programming
مفهوم کلاس (Class)
کلاس یک مفهوم پایهای بسیار مهم در برنامهنویسی شی گراست. کلاس یک بسته (blueprint) است که شامل تعدادی از ویژگیها (fields) و صفاتی است که یک شی میتواند داشته باشد و همچنین شامل تواناییها (methods)یی است که یک شی قادر به انجام آنهاست.
کلاس همچون یک قالب، نقشه و یا الگو عمل میکند و ویژگیهای عمومی اشیاء را تعیین میکند. کلاس به صورت مستقیم قابل استفاده نیست و باید از آن یک شیء (object) یا همان نمونه (instance) ساخت تا با کمک شیء بتوان از ویژگیها و قابلیتهای درون کلاس استفاده کرد.
در تعریف بالا اسم شی را بردیم؛ شیء چیست؟ شیء (Object) یک نمونه (instance) از کلاس است که هنگام استفاده از یک کلاس باید ابتدا یک شیء از آن کلاس را نمونهسازی (instantiate) کنیم.
( البته بعضی از کلاسها را نمیتوان نمونهسازی کرد که بعدا توضیح خواهیم داد )
حالا برویم سراغ ساخت یک کلاس. فرض کنید ما کلاسی میخواهیم داشته باشیم که تمام اعضای این کلاس باید یک نام و یک سن داشته باشند و بتوانند خودشان را معرفی کنند. همانطور که میبینید کلاس زیر این دو ویژگی و یک توانایی را دارد:
class Student
{
// (Fields) ویژگی ها و دادههایی که شیء نگهداری میکند
public string Name; // نام دانشجو
public int Age; // سن دانشجو
// متد سازنده (Constructor) - متدی خاص که هنگام ایجاد شیء اجرا میشود و ویژگیها را مقداردهی اولیه میکند
public Student(string name, int age)
{
Name = name;
Age = age;
}
// متد (Method) - رفتارهایی که شیء میتواند انجام دهد
public void Introduce()
{
Console.WriteLine($"سلام، من {Name} هستم و {Age} سال دارم.");
}
}
خب در کلاس Student میبینید که دو ویژگی به نامهای Name و Age وجود دارد. Name از نوع string است و برای ذخیره نام دانشجو استفاده میشود. Age از نوع int است و برای ذخیره سن دانشجو استفاده میشود. همچنین یک متد سازنده (Constructor) وجود دارد که این ویژگیها را مقداردهی اولیه میکند (این متد هنگام ایجاد شیء اجرا میشود). این کلاس همچنین دارای یک متد به نام Introduce میباشد که قادر است یک متن را در کنسول چاپ کند.
در بالا گفتیم که هنگام استفاده از یک کلاس، لازم است تا یک نمونه از آن را بسازیم (نمونهسازی کنیم). در دو خط زیر، ما دو نمونه از کلاس Student را با نامهای student1 و student2 ساخته و مقداردهی اولیه کردهایم:
// ساخت شیء از کلاس Student (نمونهسازی)
Student student1 = new Student("رضا", 20);
Student student2 = new Student("الهام", 22);
در واقع با ایجاد نمونه از کلاس، یک فضای حافظه برای شیء اختصاص داده میشود و ویژگیهای آن با مقادیر اولیه مقداردهی میشوند. با ایجاد نمونه از کلاس به تنهایی کار خاصی انجام نمیشود و این نمونه درون حافظه بصورت بلااستفاده میماند. ما باید کاری کنیم تا هدف اصلی از موجودیت کلاس تامین شود و آن هم اجرای قابلیت های درون کلاس است و آن هم با کمک گرفتن از نام نمونه میسر می باشد
در دو خط زیر، با کمک نام نمونههای ساخته شده از کلاس بالا، به تنها تابع موجود در آن دسترسی پیدا کرده و آن را به اجرا درمیآوریم:
// فراخوانی متد برای هر شیء
student1.Introduce(); // خروجی: سلام، من رضا هستم و 20 سال دارم.
student2.Introduce(); // خروجی: سلام، من الهام هستم و 22 سال دارم.
در این درس آموختید چگونه یک کلاس را تعریف کنید، ویژگیها و رفتارهای مورد نیاز را در آن قرار دهید، و با نمونهسازی از آن ، کلاس را به خدمت بگیرید. تا درس بعدی، خدا نگهدار
در پست قبلی در هنگام ست کردن مقدار به درون فیلدهای کلاس هیچ شرایط خاصی وجود نداشت و هر مقداری را از اعداد صحیح به آنها می دادیم برنامه آن را می پذیرفت . اکنون حالتی را در نظر بگیرید که ما بخواهیم برای پذیرفتن اعداد پیشنهادی شرایط و مقررات خاصی را اعمال کنیم و هر عددی را از کاربر و یا از رویدادهای درون کلاس نپذیریم حال چگونه اینکار را می توانیم انجام دهیم. اینکار با کمک گت و ست کردن یک مقدار متعلق به یک فیلد درون برنامه بصورت دستی و با کمک get و set صورت می گیرد در این حالت است که طبق آنچه در تصویر مشاهده می کنید شرط گذاشتن برای هر دو حالت get و set امکان پذیر می شود که البته در اینجا ما فقط برای set کردن شرط گذاشته ایم تا اعداد ورودی فقط بین 0 تا 255 باشند .
در تصویر زیر نیز می بیندکه باز باید از کلاس یک نمونه بسازیم و با دسترسی به فیلد مربوطه عدد دلخواه را درون آن ست کنیم . مثلا در اینجا عدد 37 می باشد که چون این عدد بین 0 و 255 می باشد پس شرایط مورد نظر را داشته پس بنابر این روی لیبل برنامه چاپ می شود .