Ҳусусиятлар синф майдонлари билан ишлашга рухсат олишни ташкил қилади. Одатда, ҳусусиятлар синфнинг ёпиқ майдонлари билан боғлиқ ва уларни ўқиш ва ўрнатиш усулларини белгилаб беради. Ҳусусият синтаксиси қуйидагича:
[ атрибутлар ] [ спецификаторлар ] тип ҳусусият_nomi
{
[ get ruxsat_kodi
[ set ruxsat_kodi ]
}
Ҳусусият ва усуллар учун спецификаторларнинг қийматлари ўхшаш. Кўпинча Ҳусусиятлар public спецификатори билан эълон қилинади. Рухсат коди операторлар блогидан иборат бўлиб, ўқиш (get) ёки ўрнатиш (set) ҳусусиятлари остида бажарилади. Айрим холларда ёки get қисми ёки set қисми тушириб қолдирилиши мумкин, аммо уларнинг хар иккисини хам бир вақтда тушириб қолдириб бўлмайди.
Агар set қисми тушириб қолдирилган бўлса, ҳусусият фақат ўқишга рухсат беради холос (read-only), агар get қисми тушириб қолдирилган бўлса, у холда ҳусусият фақат ёзиш учун рухсат беради (write-only).
Ҳусусиятларни тавсифлашга намуна:
public class Button: Control
{
private string caption; // ҳусусият билан боғланган ёпиқ майдон
public string Caption { // ҳусусият
get { // Ҳусусиятни ўқиш усули
return caption;
}
set { // Ҳусусиятни ўрнатиш усули
if (caption != value) {
caption = value;
}
}
}
...
}
Ёзиш усули одатда ўрнатилаётган қийматларнинг очиқлигини текшириш бўйича харакатлар бажаради, ўқиш усули эса масалан, майдонга мурожаатлар сонини ҳисоблагични ўз ичига толиши мумкин.
Қуйидаги дастурда ҳусусият худди синф майдони каби кўринади, масалан:
Button ok = new Button();
ok.Caption = "OK"; // Ҳусусиятни ўрнатиш усулига мурожаат
string s = ok.Caption; // Ҳусусиятни ўқиш усулига мурожаат
При обращении к свойству автоматически вызываются указанные в нем усуллар чтения и установки.
Ҳусусиятларни ўқиш ва ёзиш худди усулларга ўхшайди. get усули ўз ичига return операторини хам олиши керак. Set усулида ўрнатиладигоан қийматдан иборат value номли стандарт параметрдан фойдаланилади.
18.6-листингдаги Monster синфига шу синф ёпиқ майдтогнлари билан ишлашга имкон берувчи ҳусусият қўшамиз. Синф коди бир оз катталашиб кетсада, ундан амалда фойдаланиш осонлашади.
using System;
namespace ConsoleApplication1
{
class Monster
{ public Monster()
{
this.health = 100;
this.ammo = 100;
this.name = "Noname";
}
public Monster( string name ) : this()
{
this.name = name;
}
public Monster( int health, int ammo, string name )
{
this.health = health;
this.ammo = ammo;
this.name = name;
}
public int Health //Health ҳусусияти health майдони билан боғланган
{
get
{
return health;
}
set
{
if (value > 0) health = value;
else health = 0;
}
}
public int Ammo //Ammo ҳусусияти ammo майдони билан боғланган
{
get
{
return ammo;
}
set
{
if (value > 0) ammo = value;
else ammo = 0;
}
}
public string Name //Name ҳусусияти name майдони билан боғланган
{
get
{
return name;
}
}
public void Passport()
{
Console.WriteLine("Monster {0} \t health = {1} ammo = {2}",
name, health, ammo);
}
string name; // ёпиқ майдонлар
int health, ammo;
}
class Class1
{ static void Main()
{
Monster Masha = new Monster( 200, 200, "Masha" );
Masha.Passport();
--Masha.Health; // ҳусусиятлардан фойдаланиш
Masha.Ammo += 100; // ҳусусиятлардан фойдаланиш
Masha.Passport();
}
}
}
18.7-листинг. Monster синфи ҳусусиятлари билан
Дастурнинг натижаси қуйидагича:
Monster Masha health = 200 ammo = 200
Monster Masha health = 199 ammo = 300
Do'stlaringiz bilan baham: |