در این مقاله از سری مقالات آموزشی پی استور به بررسی مفاهیم پایهای کلاس ها و اشیا در سی شارپ «#Class and Objects in C» پرداخته و نحوهی تعریف، استفاده و مدیریت آنها را توضیح میدهیم. همچنین، با ارائه مثالهایی از نحوهی استفاده از سازندهها و تخریبگرها، راهکارهای بهینهسازی استفاده از حافظه و عملکرد سیستم را مورد بررسی قرار می دهیم.
مقدمه
در برنامهنویسی شیءگرا (Object-Oriented Programming یا OOP)، مفاهیم کلاسها و اشیاء به عنوان مبنای اصلی توسعه نرمافزار شناخته میشوند. این مفاهیم به توسعهدهندگان این امکان را میدهند که کدهایی ساختارمند، قابل نگهداری و مقیاسپذیر ایجاد کنند. کلاسها بهعنوان طرح یا پروتوتایپهایی برای ایجاد اشیاء عمل میکنند، در حالیکه اشیاء نمونههایی از این کلاسها هستند که دارای ویژگیها و رفتارهای منحصر به فرد خود میباشند.
پیش از یادگیری کلاسها و اشیاء، آشنایی با مفاهیم پایهای برنامهنویسی مانند متغیرها، انواع دادهها، دستورات شرطی، آرایهها، رشتهها و حلقهها ضروری است. همچنین، نصب و راهاندازی یک محیط توسعه مثل ویژوال استودیو به شما کمک میکند تا کدنویسی را بهصورت عملی شروع کنید.
کلاس و شیء مفاهیم پایهای برنامهنویسی شیءگرا هستند که حول موجودات دنیای واقعی میچرخند. یک کلاس یک طرح یا پروتوتایپ «prototype» تعریف شده توسط کاربر است که از آن اشیاء ساخته میشوند. اساساً، یک کلاس فیلدها و متدها (توابع عضو که اقدامات را تعریف میکنند) را در یک واحد ترکیب میکند. در #C، کلاسها از چندشکلی «Polymorphism» و ارثبری «Inheritance» پشتیبانی میکنند و همچنین مفاهیم کلاسهای مشتق شده و کلاسهای پایه را فراهم میآورند.
کلاس در سیشارپ
برای درک اشیاء ابتدا باید مفهوم کلاس را یاد بگیریم.
کلاس مانند نقشه یا طرحی برای ایجاد اشیاء است. به عبارت دیگر، کلاس، الگویی «Blueprint» است که مشخص میکند یک شیء چه ویژگیها و رفتارهایی دارد.
برای مثال میتوان کلاس را به طرح اولیه یک خانه تشبیه کرد که شامل جزئیاتی مثل تعداد طبقات، درها، پنجرهها و غیره است. این طرح برای ساخت خانه استفاده میشود. خانههای واقعی که از این طرح ساخته میشوند همان اشیاء هستند.
همانطور که میتوان تعداد زیادی خانه از یک طرح اولیه ساخت، میتوان اشیاء متعددی را از یک کلاس ایجاد کرد.
تعریف کلاس در سی شارپ
بهطور کلی، تعریف یا اعلان «Declaring» یک کلاس تنها شامل کلمه کلیدی class است که به دنبال آن شناساییکننده (نام) کلاس قرار میگیرد. با این حال، برخی ویژگیهای اختیاری میتوانند همراه با اعلان کلاس بر اساس نیاز برنامه استفاده شوند. اعلان کلاسها میتوانند این اجزا را شامل شوند، به ترتیب:
- اصلاحکنندهها «Modifiers»: برای تعریف سطوح دسترسی استفاده میشوند و اصلاحکننده پیشفرض کلاس داخلی است.
- کلمه کلیدی کلاس «Keyword class»: از کلمه کلیدی class برای اعلان یک کلاس استفاده میشود.
- شناساییکننده کلاس «Class Identifier»: متغیر از نوع کلاس ارائه میشود. شناساییکننده (نام کلاس) باید طبق سنت با حرف بزرگ شروع شود.
- کلاس پایه «Base class» (اختیاری): اگر کلاسی از کلاس والد خود (کلاس فوقانی) ارثبری میکند، در این صورت با علامت : (دوتا نقطه) شروع میشود.
- رابطها «Interfaces» (اختیاری): فهرستی از رابطهایی که کلاس پیادهسازی کرده است، در صورت وجود، به صورت جدا شده با کاما و پیش از آن با علامت : (دوتا نقطه) قرار میگیرد. یک کلاس میتواند بیشتر از یک رابط را پیادهسازی کند.
- بدنه «Body»: بدنه کلاس با { } (براکتهای منحنی) احاطه شده است و میتواند اعضای کلاس مانند ویژگیها، متدها، سازندهها «Constructor»، رویدادها و غیره را شامل شود.
مثال کلاس در سی شارپ
قطعه کد زیر نمونهای ساده از نحوهی استفاده از کلاسها و متدها در زبان برنامهنویسی #C است.
// Declaration of class using System; // declaring public class public class PStore { // field variable public int a, b; // member function or method public static void display() { Console.WriteLine("Class & Objects in C#"); } public static void Main(String[] args) { display(); } }
خروجی
Class & Objects in C#
توضیح: کد بالا یک شیء از کلاس Dog را با ویژگیهای خاص ایجاد کرده و اطلاعات مربوط به آن را به صورت متنی به کنسول نمایش میدهد. از طریق این کد میتوان مشاهده کرد که چگونه کلاس ها و اشیا در سی شارپ کار میکنند و چطور سازندهها و متدهای دسترسی برای مدیریت ویژگیهای یک شیء استفاده میشوند.
اشیاء در سی شارپ
شیء «Object » واحد پایهای برنامهنویسی شیءگرا است و نمایانگر موجودات دنیای واقعی است. همچنین میتواند به نمونهای از یک کلاس اشاره کند. شیء از آن کلاس ایجاد میشود. یک شیء دادهها را نگه میدارد و میتواند به متدها و ویژگیهای آنها دسترسی داشته باشد. در #C، یک شیء شامل موارد زیر است:
- وضعیت «State»: این توسط ویژگیهای یک شیء نمایان میشود و خواص شیء را منعکس میکند.
- رفتار «Behaviour»: این توسط متدهای یک شیء نمایان میشود و همچنین پاسخ شیء را نسبت به اشیاء دیگر نشان میدهد.
- هویت «Identity»: این به شیء یک نام منحصر به فرد میدهد و امکان تعامل یک شیء با دیگر اشیاء را فراهم میکند. برای مثال، یک سگ را به عنوان شیء در نظر بگیرید و نمودار زیر را برای هویت، وضعیت و رفتار آن مشاهده کنید.
اشیاء معادل موجودات دنیای واقعی هستند. به عنوان مثال، یک برنامه گرافیکی ممکن است اشیائی مانند دایره، مربع، منو داشته باشد. یک سیستم خرید آنلاین ممکن است اشیائی مانند سبد خرید، مشتری و محصول داشته باشد.
تعریف اشیا در سی شارپ
تعریف یا اعلان «Declaring» اشیاء که به آن نمونهسازی کلاس گفته میشود.
هنگامی که یک شیء از یک کلاس ایجاد میشود، گفته میشود که کلاس نمونهسازی شده است. تمام نمونهها ویژگیها و رفتارهای کلاس را به اشتراک میگذارند. اما مقادیر آن ویژگیها، یعنی وضعیت، برای هر شیء منحصر به فرد است. یک کلاس واحد میتواند هر تعداد نمونه داشته باشد.
مثال
همانطور که متغیرها را به صورت (type name) اعلام میکنیم. این به کامپایلر اطلاع میدهد که از نام برای ارجاع به دادههایی با نوع مشخص استفاده خواهیم کرد. با یک متغیر ابتدایی، این اعلام همچنین میزان صحیحی از حافظه را برای متغیر رزرو میکند. بنابراین، برای متغیرهای ارجاعی، نوع باید دقیقاً نام یک کلاس مشخص باشد.
Dog Buddy;
اگر یک متغیر ارجاعی (Buddy) را به این صورت اعلام کنیم، مقدار آن تا زمانی که یک شیء واقعی ایجاد شده و به آن اختصاص داده نشود، نامشخص (null) خواهد بود. صرفاً اعلام یک متغیر ارجاعی، شیءای ایجاد نمیکند.
مقداردهی اولیه شیء در سی شارپ
کلمه کلیدی new یک کلاس را با تخصیص حافظه برای یک شیء جدید نمونهسازی کرده و یک ارجاع به آن حافظه برمیگرداند. عملگر new همچنین سازنده کلاس را فراخوانی میکند.
مثال
// Initialization of an object using System; // Class Declaration public class Dog { // Instance Variables String name; String breed; int age; String color; // Constructor Declaration of Class // same name as class public Dog(String name, String breed, int age, String color) { this.name = name; this.breed = breed; this.age = age; this.color = color; } public String GetName() { return name; } public String GetBreed() { return breed; } public int GetAge() { return age; } public String GetColor() { return color; } public override String ToString() { return "my name is: " + name + "\nmy breed is: " + breed + "\nmy age is: " + age; } public static void Main(String[] args) { // Creating object Dog Buddy = new Dog("Buddy", "Golden Retriever", 3, "Golden"); Console.WriteLine(Buddy.ToString()); } }
خروجی
my name is: Buddy my breed is: Golden Retriever my age is: 3
کد بالا یک شیء از کلاس Dog را با ویژگیهای خاص ایجاد کرده و اطلاعات مربوط به آن را به صورت متنی به کنسول نمایش میدهد. از طریق این کد میتوان مشاهده کرد که چگونه کلاسها و اشیاء در #C کار میکنند و چطور سازندهها و متدهای دسترسی برای مدیریت ویژگیهای یک شیء استفاده میشوند.
وقتی که یک شیء از کلاس Dog ایجاد میکنیم و پارامترها را به سازنده میدهیم، حافظه برای این اشیاء مختلف تخصیص داده میشود و آدرس آنها به شیء کلاس اشاره میکند، همانطور که در تصویر نشان داده شده است:
نکات مهم کلاس ها و اشیا در سی شارپ
- کلاسها و اشیاء مفاهیم بنیادی OOP هستند و با استفاده از آنها میتوانیم جنبههای مختلفی مانند ارثبری «Inheritance»، کپسولهسازی «Encapsulation»، انتزاع «Abstraction» و غیره را به دست آوریم.
- برای مقداردهی به مقادیر میتوانیم از سازنده «Constructor» استفاده کنیم که این فرآیند را به صورت فشردهتر انجام میدهد، همانطور که در مثال بالا نشان داده شده است.
- هنگامی که یک شیء ایجاد میشود، حافظه برای ذخیره دادههای آن تخصیص داده میشود و آدرس شیء به متغیر اختصاص داده میشود.
- برای استفاده بهینه از حافظه، میتوانیم از نابودکنندهها «Destructor» برای از بین بردن نمونه استفاده کنیم. اگر کار آن تمام شده باشد، نیازی به ادامه آن نیست.
نتیجهگیری
در نهایت، کلاسها و اشیاء مفاهیم اساسی در برنامهنویسی شیءگرا هستند که به توسعهدهندگان این امکان را میدهند تا نرمافزارهایی منظم و مقیاسپذیر ایجاد کنند. در زبان C#، استفاده از کلمه کلیدی new برای نمونهسازی کلاسها، تخصیص حافظه و فراخوانی سازندهها، فرآیند ایجاد اشیاء را ساده و کارآمد میسازد. همچنین، با استفاده از نابودکنندهها، میتوان به بهینهسازی مصرف حافظه و مدیریت منابع پرداخته و از به هدر رفتن آنها جلوگیری کرد. در مجموع، درک صحیح از نحوهی استفاده از کلاسها و اشیاء در برنامهنویسی C#، یکی از ارکان اصلی برای توسعه برنامههای شیءگرا و دستیابی به کدهای با کیفیت و قابل نگهداری است.