در بخشهای قبلی مفاهیم اولیه زبان #C مثل عملیاتهای ریاضی، ساختارهای حلقه و تصمیم و انواع عملگرها را بیان کردیم. در این قسمت وارد مبحث مهم شی گرایی خواهیم شد و سعی ما بر این است که بیشتر بر روی ساختار شی گرایی در سی شارپ متمرکز شویم و نه مفهموم آن. مفهموم شیگرایی در اکثر زبانهای برنامه نویسی به یک معناست و میتوانید از این این مطلب برای مرور و یادگیری آن استفاده کنید. همراه ما باشید.
مفاهیم اصلی شی گرایی در سی شارپ
کلاس (Class)
یکی از پایهترین مفاهیم شی گرایی در سی شارپ، کلاس میباشد. کلاس به ما اجازه میدهد نوع دادهای تعریف کنیم که شامل فیلدها، خواص و متدهاست. شیء متغیری از نوع کلاس است که از فیلدها، خواص و متدهای کلاس پیروی میکند. در زیر نحوه تعریف کلاس در سی شارپ را مشاهده میکنید. فیلدها اعضای دادهای هستند که کلاس برای ذخیره نتایج محاسبات، اعمال و رفتارها استفاده میکند. متدها در واقع رفتارها یا کارهایی هستند که کلاس میتواند انجام دهد.
1 2 3 4 5 6 7 8 9 10 11 |
class ClassName { field1; field2; field3; method1; method2; method3; } |
نحوه ایجاد شیء و نحوه دسترسی به فیلدها و متدهای کلاس از طریق شی را در زیر مشاهده میکنید.
1 2 3 4 5 |
ClassName ObjectName = new ClassName(); // نحوه ایجاد شی از کلاس ObjectName.FieldName; // دسترسی به فیلدها ObjectName.MethodName; // دسترسی به متدها |
مثالی که در زیر آوردهایم تمام مطالب گفته شده تا اینجا در مورد مبحث شی گرایی در سی شارپ را پوشش میدهد. کلاسی به نام Rectangle ایجاد کردهایم، که دارای خصوصیات و رفتارهای مستطیل مثل طول و عرض، مساحت و محیط است و در واقع با گرفتن طول و عرض، مساحت و محیط را برای ما حساب میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Rectangle rect = new Rectangle(); rect.height = 10; rect.width = 5; rect.Area(); rect.Perimeter(); } } class Rectangle { public int width; public int height; public void Area() { Console.WriteLine($"Area = {width * height}"); } public void Perimeter() { Console.WriteLine($"Perimeter = {2 * (width + height)}"); } } } |
1 2 3 |
Area = 50 Perimeter = 30 |
به توضیح برنامه خواهیم پرداخت؛ یک کلاس به نام Rectangle ایجاد کردیم که دارای دو فیلد (width و height) و دو متد (Area و Perimeter) است؛ با مقداردهی طول و عرض، مساحت و محیط را به دست آوردیم. با توجه به این که طول و عرض مقادیر دادهای هستند از فیلد استفاده کردهایم. اما برای به دست آوردن مساحت و محیط چون نیاز به محاسبه هست از متد استفاده کردهایم.
سازنده (Constructor)
سازندهها (که یکی از مهمترین موارد در مبحث شی گرایی در سی شارپ میباشند)، در واقع متدهای خاصی هستند که هنگام ایجاد اشیاء به طور خودکار اجرا میشوند. در مثال بالا ما سازندهای برای کلاس Rectangle ننوشتهایم. اما کامپایلر، سازنده پیشفرض (که بدون پارامتر است) را به کلاس اضافه میکند. از سازنده میتوان برای مقداردهی به فیلدها و کدهایی که میخواهیم در هنگام ایجاد شیء اجرا شوند استفاده کرد. میتوان در یک کلاس از تعداد زیادی سازنده استفاده کرد که دارای پارامترهای متفاوتی هستند.
در زیر نحوه تعریف سازنده آورده شده است:
1 2 3 4 5 |
public ClassName(paramType paramName, paramType paramName,...) { statement; } |
همانطور که انتظار میرود، سازنده، نوع خروجی ندارد و همنام کلاس است. حال مثال قبل را با سازنده بازنویسی کرده و طول و عرض (width , height) مستطیل را هنگام ایجاد شیء مقداردهی میکنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Rectangle rect = new Rectangle(10, 5); rect.Area(); rect.Perimeter(); } } class Rectangle { public int width; public int height; public Rectangle(int width, int height) { this.width = width; this.height = height; } public void Area() { Console.WriteLine($"Area = {width * height}"); } public void Perimeter() { Console.WriteLine($"Perimeter = {2 * (width + height)}"); } } } |
1 2 3 |
Area = 50 Perimeter = 30 |
مقداردهی پارامترهای سازنده در سی شارپ، هنگان استفاده از دستور ایجاد شیء، ما بین پرانتزها انجام میشود. در این مثال مقدار 10 به پارامتر width و مقدار 5 به پارامتر height ریخته میشود. در داخل متد سازنده مقدار پارامترهای width و height در فیلدهای width و height قرار میگیرد.
اما کلمه کلیدی this چیست؟ اگر دقت کنید متوجه خواهید شد که نام پارامترهای متد سازنده و فیلدهای کلاس یکسان است. بنابراین اگر متد سازنده را بدون this بنویسیم، فیلدهای width و height مربوط به کلاس مقداردهی نشده و نتیجه نهایی اشتباه میشود. اما کلمه this مشکل ما را حل میکند. در واقع میتوان گفت که در استفاده از شی گرایی در سی شارپ، در واقع کلمه کلیدی this نام مستعار شیءِ فراخوانکنندۀ متدِ سازنده است.
مخرب (Destructor)
مخربها نقطه مقابل سازندهها در سی شارپ هستند. مخرب وقتی اجرا میشوند که یک شیء از بین برود و یک شیء زمانی از بین میرود که برنامه از محدوده خارج شود. در زیر دستور نوشتن مخرب را مشاهده میکنید.
1 2 3 4 5 |
~ClassName() { statements; } |
همانند سازندهها، مخربها نیز همنام کلاس هستند. مخربها برای پاکسازی حافظه در هنگامی که شیء، حجم عظیمی از حافظه را اشغال میکند، استفاده میشوند. برای درک بیشتر مطلب به مثال زیر توجه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { MyClass obj = new MyClass(); //Constructor is excuted Console.WriteLine("*********************"); } } class MyClass { public MyClass() { Console.WriteLine("This is Constructor"); } ~MyClass() { Console.WriteLine("This is Destructor"); } } } |
1 2 3 4 |
This is Constructor ********************* This is Destructor |
همانطور که مشاهده میکنید وقتی برنامه از محدودهی در دسترس بودن شی تعریف شده خارج شود. مخرب اجرا میشود.
فیلدهای فقط خواندنی (readonly)
برای تعریف فیدهای فقط خواندنی در سی شارپ، از کلمه کلیدی readonly استفاده میشود. این نوع فیلدها بسیار شبیه به ثابتها هستند اما یک تفاوت بسیار مهم دارند؛ و آن تفاوت این است که میتوان این فیلدها را بدون مقدار تعریف کرده و فقط آنها را از طریق سازنده مقداردهی کرد. بعد از مقداردهی دیگر نمیتوان مقدار فیلد را عوض کرد. برای درک این مفهوم مثال زیر را ببینید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Example obj = new Example(15); Console.WriteLine(obj.num1); Console.WriteLine(obj.num2); } } class Example { public readonly int num1 = 10; public readonly int num2; public Example(int num) { num2 = num; } } } |
1 2 3 |
10 15 |
از آن جایی که فیلدهای readonly تنها باید یکبار مقدار بگیرند و همینطور سازنده یه کلاس هم تنها یکبار در زمان ساخت شی اجرا میشود، پس فقط و فقط فیلدهای readonly در داخل سازنده قابل تغییر بوده و در دیگر متدها یا بیرون از کلاس نمیتوان مقدار آن را تغییر داد.
دوستان به اتمام این بخش از آموزش رسیدیم و سعی شد مفاهیم کلاس، سازنده و مخرب در برنامه نویسی به روش شی گرایی در سی شارپ ، به همراه کاربرد فیلدهای فقط خواندنی (readonly) بیان شود. باز هم یادآوری میکنم که شما دوستان عزیز میتونید از این لینک مفاهیم مرتبط با شیگرایی در ++C را مطالعه کنید.
برای قسمت تکمیلی این آموزش کلیک نمایید.