یکی از مباحث مهم در بحث شی گراییبرنامه نویسی شی گرا چیست؟ شی گرایی چیست؟این صفحه عالی به معرفی برنامه نویسی شی گرا پرداخته و توضیح داده شی گرایی یا همان object oriented یا OPP چیست؟ همچنین مزایای برنامه نویسی شی گرا را بیان کرده، بحث Encapsulation یا کپسوله سازی است. کپسوله سازی به معنای پنهان کردن دادههای حساس از دید کاربران است و ارتباط کاربران و دیگر کلاسها با این متغیرها و دادهها میبایست از طریق متدها امکان پذیر باشد، بنابراین متغیرهای حساس میبایست از نوع Private درون کلاسها تعریف شوند. به طور خلاصه Propertyها که در فارسی به آن خصیصه نیز میگویند در اینجا همانند یک پل ارتباطی بین کاربران بیرونی و فیلدهای Private کلاس هستند، بنابراین لازم است تا Propertyها به صورت Public تعریف شوند تا از دیگر کلاسها نیز قابل دسترسی باشند.
ساختار یک Property
Property در زبان سی شارپ دارای دو بخش Setter و Getter هستند که با سینتکس set و get نوشته میشوند. بخش set برای مقدار دادن به فیلدهای Private مورد استفاده قرار میگیرد و بخش get نیز برای دریافت و استخراج کردن اطلاعات از درون فیلد Private (به این متدها اصطلاحا Accessor میگویند).
یک مثال ساده از پیاده سازی Property
به طور کلی ساختار کد یک Property به صورت زیر است:
<access_modifier> <return_type> <property_name>
{
get { // body }
set { // body }
}
در کد زیر یک مثال ساده از پیاده سازی Property در زبان #C آورده شده است:
class BankAccount
{
private int balance; // field
public int Balance // property
{
get { return balance; } // get method
set { balance = value; } // set method
}
}
همانطور که مشاهده میکنید، فیلد balance در کلاس BankAccount به صورت Private تعریف شده است و از خارج از کلاس امکان تغییر دادن و یا خواندن آن ممکن نمیباشد، در عوض خصیصهای با نام Balance تعریف شده است که دارای دو متد get و set است. با فراخوانی متد get، مقدار فیلد balance برگردانده میشود و با استفاده از متد set نیز میتوان به متغیر balance مقدار داد. برای استفاده از این Property در کلاسهای دیگر به صورت زیر عمل میکنیم:
BankAccount ba = new BankAccount();
ba.Balance = 1000; // set balance field
Console.WriteLine(ba.Balance); // get balance field value
همانطور که مشاهده میکنید این کار به صورت خیلی ساده انجام شده است و با خصیصهی Balance همانند یک متغیر عادی رفتار کردهایم.
دوره برنامه نویسی سی شارپ
نمونه فیلمهایی از جلسات برنامه نویسی سی شارپ
شرطی سازی Property در سی شارپ
شاید در نگاه اول بگویید الان به چه دلیل از یک Property استفاده کردهایم، وقتی به راحتی میتوان به جای اینکار دسترسی فیلدها را عمومی کرد و بدون نیاز به خصیصهها آنها را تغییر داد و یا دریافت کرد. قطعا بدون Property هم میتوان این کار را انجام داد، اما باید بدانید که توابع get و set را میتوانید شرطی کنید و به هر نحوی که خواستید با فیلدهای Private ارتباط برقرار کنید. به عنوان مثال در کد بالا مقدار فیلد balance که نمایندهی موجودی حساب بانکی کاربران است، نمیتواند مقدار منفی بگیرد. بنابراین با گذاشتن یک شرط در تابع set مربوط به Property مذکور میتوانیم این محدودیت را اعمال کنیم. به کد زیر توجه کنید:
public int Balance // property
{
get { return balance; } // get method
set
{
if (value > 0) { balance = value; }
} // set method
}
در مثال بالا مقدار value مقداری است که در خارج از کلاس به خصیصهی Balance نسبت داده شده است. فیلد خصوصی balance تنها در صورتی مقدارش برابر با مقدار دریافتی میشود که، مقدار دریافتی از کلاسهای دیگر بزرگتر از صفر باشد. بنابراین اگر کد زیر را اجرا کنید، مقدار balance تغییری نخواهد کرد، زیرا شرط بزرگتر از صفر بودن برقرار نبوده است:
در اینجا مقدار value که در تابع set مورد استفاده قرار گرفته است برابر 10- میشود که کوچکتر از 0 است.
توجه: این یک قرارداد است که فیلدهای خصوصی با حرف کوچک شروع میشوند (مانند balance) و خصیصهها با حرف بزرگ (مانند Balance). هیچ اجباری در اینکار وجود ندارد، اما برنامه نویسان سی شارپ معمولا ترجیح میدهند تفاوت در نام خصیصه و فیلدها را اینگونه مشخص میکنند.
نمونه فیلمهای دورههای مهارتی
انواع Property
به طور کلی 4 نوع Property داریم:
- خصیصههای نوشتنی و خواندنی (Read and Write Properties)
- خصیصههای فقط نوشتنی (Write-only Properties)
- خصیصههای فقط خواندنی (Read-only Properties)
- خصیصههای اتوماتیک (Automatic Implemented Properties)
قبلتر با خصیصهای از نوع نوشتنی و خواندنی آشنا شدیم، در ادامه میخواهیم به دیگر انواع مختلف Propertyها بپردازیم.
خصیصه های فقط خواندنی (Read-only Properties)
اگر یک Property یا خصیصه تنها شامل متد get باشد، به آن خصیصه از نوع فقط خواندنی یا Read-only میگویند. به عنوان مثال فرض کنید کلاس Student مربوط به ثبت مشخصات دانش آموزان، شامل 3 فیلد خصوصی با نامهای firstName، lastName و age است. میتوان یک Property تعریف کرد که بتوان به صورت یکجا کل اطلاعات دانش آموزان را برگرداند. بنابراین در اینجا تغییر این فیلدها برای ما مطرح نیست بلکه تنها خواندن این اطلاعات برایمان اهمیت دارد، به کد زیر توجه کنید:
class Student
{
private string firstName;
private string lastName;
private int age;
public string StudentInformation
{
get
{
return firstName + " " + lastName + " " + age;
}
}
}
به وسیلهی خصیصهی StudentInformation میتوان نام، نام خانوادگی و سن یک دانش آموز را در قالب یک رشته یا String دریافت کرد.
خصیصه های فقط نوشتنی (Write-only Properties)
خصیصههای نوشتنی فقط شامل یک متد set میباشد، هرچند که این نوع خصیصهها کمتر مورد استفاده قرار میگیرند اما به هر حال امکان نوشتن چنین چیزی وجود دارد، به مثال زیر توجه کنید:
class User
{
private string password;
public string Password
{
set
{
password = value;
}
}
{
در خصیصهی Password، تنها میتوان یک مقدار جدید به فیلد password نسبت داد و امکان خواندن آن وجود ندارد.
خصیصه های اتوماتیک یا خودکار (Automatic Implemented Properties)
در اکثر اوقات ما تنها نیاز به نوشتن خصیصهای داریم که مقدار فیلد خصوصی را Return داده و مقدار جدید دریافتی را به آن فیلد منتسب میکند. یعنی نیازی به پیاده سازی بنده ی get و set نداریم، مانند اولین کد مثال آورده شده در این مقاله. از نسخهی 3.0#C ، یک نوع Property دیگر با نام Auto Implemented Properties به زبان سی شارپ اضافه شد، این خصیصه در واقع تنها نسخهی کوتاه شدهی نوشتن یک Property به همراه یک فیلد Private است. با استفاده از این خصیصه، دیگر نیازی به نوشتن فیلد Private نیست و زبان سی شارپ به طور خودکار اینکار را برایمان انجام میدهد. در کد زیر، مثال گفته شدهی اول از کلاس BankAccount را این بار به وسیلهی خصیصههای خودکار پیاده سازی کردیم:
class BankAccount
{
public int Account // property
{ get; set; }
{
دسترسی های مختلف متدهای Property
یکی از مباحث دیگر مربوط به خصیصهها، امکان تعریف دسترسیهای مختلف برای متدهای get و set آنها است. به عنوان مثال ممکن است متد get به صورت عمومی قابل دسترس باشد و تمامی کلاسها بتوانند مقدار یک فیلد را از طریق خصیصهها بخوانند، اما متد set به صورت Private تعریف شده باشد تا فقط از درون همان کلاس بتوان مقدار جدید به فیلدهای Private نسبت داد و یا ممکن است متد set به صورت Protected باشد. به مثال زیر توجه کنید:
class Author
{
public string Name { get; set; }
public string Book { get; private set; }
public double Price { get; protected set; }
}
در مثال بالا، متد get و set خصیصهی Name به صورت عمومی قابل دسترس است، اما متد set در خصیصهی Book به صورت Private تعریف شده است. بنابراین خصیصهی Book تنها از درون کلاس میتواند مقدار بگیرد. همچنین متد set خصیصهی Price به صورت Protected تعریف شده است، بنابراین از درون کلاس و کلاسهای مشتق شده (ارث بری کرده) قابل مقدار دادن به این Property هستیم.
دورههای مهارتی رشته کامپیوتر
جمع بندی:
Property یکی از مباحث مهم در زبان سی شارپ و بخش شی گراییبرنامه نویسی شی گرا چیست؟ شی گرایی چیست؟این صفحه عالی به معرفی برنامه نویسی شی گرا پرداخته و توضیح داده شی گرایی یا همان object oriented یا OPP چیست؟ همچنین مزایای برنامه نویسی شی گرا را بیان کرده است. در این مقاله به طور کلی به بحث در مورد Property، انواع آن و روشهای استفاده از آنها را در قالب نمونه مثال مورد بحث قرار دادیم.
خصیصه یا Property در سی شارپ چیست؟
Property یا خصیصه در سی شارپ یک مکانیزمی برای پیاده سازی قواعد کپسوله سازی است. خصیصهها یک واسطی هستند که به وسیلهی آنها میتوان فیلدهای خصوصی یا Privateهای واقع در کلاس را خواند و یا به صورت کنترل شده در آنها نوشت.
آیا Property ها فضا اشغال می کنند؟
خیر، Propertyها برخلاف متغیرها که نام مکانی در حافظه هستند، هیچ فضایی از حافظه را اشغال نمیکنند و تنها همانند واسطی هستند که به وسیله ی Accessorها (متدهای get و set) عملیات خواندن و نوشتن در فیلدهای خصوصی را بر عهده دارند.
چند نوع Property در زبان سی شارپ وجود دارد؟
به طور کلی 4 نوع Property در سی شارپ وجود دارد: خصیصههای نوشتنی و خواندنی، خصیصههای فقط خواندنی، خصیصههای فقط نوشتنی و در آخر خصیصههای خودکار یا اتوماتیک.