در این پست میخواهیم یاد بگیریم یک کلاس ساده بسازیم و ازش استفاده کنیم؛ کلاسی که تقریباً چیزهای مهم و اصلی یک کلاس رو داشته باشه. بیایید با یه مثال شروع کنیم و خط به خط اون رو توضیح بدیم تا برای کسایی که تازه برنامهنویسی رو شروع کردن، همه چیز روشن بشه.
فرض کنید میخواهیم یه کلاس به اسم 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());
خروجی این کد میشه: سلام، من رضا هستم.
چرا این کار مهمه؟
کلاس مثل یه جعبهست که هم اطلاعات (مثل اسم دانشجو) رو نگه میداره و هم کارهایی که میتونیم باهاش انجام بدیم (مثل معرفی کردن). با خصوصی کردن متغیرها و استفاده از تابعها، ما مطمئن میشیم که همه چیز توی برنامهمون منظم و قابل کنترله. این روش باعث میشه برنامههامون وقتی بزرگتر میشن، راحتتر مدیریت بشن و کمتر خطا داشته باشن.
به همین سادگی! حالا یه کلاس ساده ساختیم و میتونیم ازش برای چیزهای پیچیدهتر استفاده کنید.
محتویات یک کلاس در سی شارپ :
یک کلاس می تواند دارای هر کدام از 14 مورد زیر باشد که بعضی ضروری و برخی اختیاری یک کلاس می باشند .
1 . Constructors سازنده ها
2 . Constants ثابت ها
3 . Fields فیلدها ( متغیرها )
4 . Finalizers ( Destructors ) نهایی کننده ها یا ( مخرب ها )
5 . Methods روش ها
6 . Properties ویژگی ها
7 . Indexers ایندکسرها
8 . Operators عملگرها
9 . Events رویدادها
10 . Delegates نمایندگان
11 . Classes کلاس ها
12 . Interfaces رابط ها
13 . Structs ساختارها
14 . Enumerations نوع شمارشی
در این بخش
به یک کلاس استاتیک
می پردازیم کلاس
استاتیک کلاسی
است که اولا همه
اعضاء آن باید
استاتیک باشند ثانیا
برای دسترسی به
اعضاء یک کلاس
استاتیک لازم نیست
تا یک نمونه از
آن کلاس ساخته
شود بلکه فقط به
کمک نوشتن نام
کلاس و پس از آن
عملگر نقطه به
تمام اعضاء کلاس
دسترسی پیدا می
کنیم در ادامه
متن کامل یک کلاس
استاتیک به همراه
نحوه کاربرد آن
آمده
using System;
namespace StaticClassTest {
static class MathFunction
{ //معکوس عدد را برمی گرداند
static public double reciprocal(double num) { return 1 / num; }
//قسمت
اعشاری عدد را
برمی گرداند
static
public double
fracPart(double num)
{ return
num - (int)num;
}
//اعداد
زوج را برمی گرداند
static public bool isEven(double num) { return (num % 2) == 0 ? true : false; }
//اعداد فرد
را برمی گرداند
static public bool isOdd(double num) { return !isEven(num); } }
class
MainClass {
public static
void Main() {
Console.WriteLine("Reciprocal of 5 is " + MathFunction.reciprocal(5.0));
Console.WriteLine("Fractional part of 4.234 is " + MathFunction.fracPart(4.234));
if (MathFunction.isEven(10)) Console.WriteLine("10 is even.");
if (MathFunction.isOdd(5)) Console.WriteLine("5 is odd.");
Console.ReadLine(); } } }
کلاس: Class
کلاس در برنامهنویسی شیءگرا یک ساختار یا الگو (Template) است که ویژگیها (دادهها) و رفتارها (عملیات یا متدها) یک موجودیت را تعریف میکند. از کلاس میتوان برای ایجاد نمونههای قابل استفاده (اشیاء) استفاده کرد یا بهصورت استاتیک برای سازماندهی کدها و ارائه قابلیتهای مستقل از نمونهسازی به کار برد. کلاس همچنین امکاناتی مثل وراثت (Inheritance)، کپسولهسازی (Encapsulation) و چندریختی (Polymorphism) را فراهم میکند تا کد سازمانیافتهتر، قابلاستفاده مجدد و انعطافپذیرتر شود.
یک کلاس دارای اعضایی است که به دو دسته کلی تقسیم میشوند:
دادهها: شامل فیلدها (Fields) و خصوصیات (Properties) هستند که اطلاعات مربوط به شیء را نگه میدارند.
عملکردها: شامل متدها (Methods) و رویدادها (Events) هستند که رفتارها یا عملیات شیء را تعریف میکنند.
بهصورت نمادین:
کلاس = {دادهها (فیلدها و خصوصیات) + عملکردها (متدها و رویدادها)}
یک کلاس با استفاده از کلیدواژه class، به دنبال آن یک نام برای کلاس و سپس دو کروشه {} تعریف میشود. در مثال زیر، کلاسی به نام MyClass تعریف شده که هنوز هیچ عضوی ندارد و در نتیجه فعلاً کاری انجام نمیدهد:
class MyClass
{
}
کانستراکتور (Constructor)
هر کلاس میتواند یک یا چند سازنده (Constructor) داشته باشد. سازنده متدی خاص است که هنگام ایجاد نمونهای از کلاس بهصورت خودکار اجرا میشود و معمولاً برای مقداردهی اولیه به دادههای شیء استفاده میشود. اگر شما هیچ سازندهای بهصورت صریح تعریف نکنید، کامپایلر C# بهطور خودکار یک سازنده پیشفرض (Default Constructor) بدون پارامتر ایجاد میکند که هیچ عملی جز ساخت شیء انجام نمیدهد.
سازنده با تعیین سطح دسترسی (مثلاً public)، نامی دقیقاً مشابه نام کلاس و علامت () تعریف میشود و میتواند با پارامتر یا بدون پارامتر باشد. در مثال زیر، سازنده کلاس MyClass بدون پارامتر است:
class MyClass
{
public MyClass()
{
// اینجا میتوانید کد مقداردهی اولیه بنویسید
}
}
توجه: برخلاف برخی تصورات، سازنده را نمیتوان پس از ساخت شیء بهصورت دستی فراخوانی کرد. سازنده فقط هنگام نمونهسازی (با کلیدواژه new) اجرا میشود. اگر نیاز به اجرای کد خاصی بعد از ساخت شیء دارید، باید از متدهای معمولی استفاده کنید.
دسترسی به اعضای کلاس
برای دسترسی به اعضای یک کلاس (چه دادهها و چه عملکردها)، معمولاً باید ابتدا یک نمونه (Object) از آن کلاس بسازید و سپس از طریق آن نمونه به اعضایش دسترسی پیدا کنید. البته اعضای استاتیک (Static) نیازی به نمونهسازی ندارند و مستقیماً از طریق نام کلاس قابل دسترسیاند.
در مثال زیر، کلاسی به نام MyClass تعریف شده که شامل یک فیلد غیراستاتیک (nonStaticVariable)، یک فیلد استاتیک (staticVariable) و دو متد است:
using System;
namespace ClassTest
{
class Program
{
class MyClass
{
int nonStaticVariable; // متغیر غیراستاتیک (هر شیء مقدار خودش را دارد)
static int staticVariable; // متغیر استاتیک (مشترک بین همه اشیاء)
public void SetVars(int v1, int v2)
{
nonStaticVariable = v1;
staticVariable = v2;
}
public void Display()
{
Console.WriteLine("nonStaticVariable = {0} staticVariable = {1}", nonStaticVariable, staticVariable);
Console.ReadKey();
}
}
static void Main()
{
MyClass d1 = new MyClass(); // ساخت نمونه اول
MyClass d2 = new MyClass(); // ساخت نمونه دوم
d1.SetVars(2, 4);
d1.Display(); // نمایش مقادیر d1
d2.SetVars(15, 17);
d2.Display(); // نمایش مقادیر d2
}
}
}
توضیح مثال:
دو نمونه (d1 و d2) از کلاس MyClass ساخته شدهاند.
متد SetVars برای هر نمونه مقادیر متفاوتی ست کرده است.
چون nonStaticVariable غیراستاتیک است، هر نمونه مقدار خودش را نگه میدارد.
اما staticVariable استاتیک است و بین همه نمونهها مشترک است، بنابراین آخرین مقدار تنظیمشده (17) برای هر دو نمونه نمایش داده میشود.
خروجی برنامه:
nonStaticVariable = 2 staticVariable = 4
nonStaticVariable = 15 staticVariable = 17