Конструктор объектларни инициализация қилиш учун мўлжалланган бўлиб, синф объектини new хизматчи сўзи ёрдамида ташкил қилинганда тўғридан – тўғри ишга тушади. Конструктор номи синф номи билан устма-уст тушади. Қуйида консруткорларнинг ҳусусиятлари баён этилган:
Конструктор қиймат қайтармайди.
Синф бир нечта конструкторлардан иборат бўлиши мумкин.
Агар дастурчи бирорта хам конструктор кўрсатмаган ёки қандайдир майдонлар инициализация қилинмаган бўлса, қийматли майдонларга ноль, ҳавола типидаги майдонларга null қиймати берилади.
Параметрларсиўз чақириладиган конструкторларни тўғридан – тўғри конструкторлар деб аталади.
Биз хозиргача класларни тавсифлашда синф майдонларига бошланғич қийматлар ўзлаштирдик. Бу холат фақат синфнинг барча экземплярларининг айрим майдонларидаги бошланғич маълумотлар ибр хил бўлганда қулай ҳисобланади.Агар объектларни яратишда майдонга турли қийматларни ўзлаштиришга тўғри келса, бу ишни конструкторда бажарган маъқул. 18.3- листингда Demo синфига конструктор қўшилган, майдонлар эса ёпиқ.
using System;
namespace ConsoleApplication1
{
class Demo
{
public Demo( int a, double y ) // параметрли конструктор
{
this.a = a;
this.y = y;
}
public double Gety() // y майдондаги маълумотни ўқиш
{
return y;
}
int a;
double y;
}
class Class1
{ static void Main()
{
Demo a = new Demo( 300, 0.002 ); // конструкторни чақириш
Console.WriteLine( a.Gety() ); // натижа: 0,002
Demo b = new Demo( 1, 5.71 ); // конструкторни чақириш
Console.WriteLine( b.Gety() ); // натижа: 5,71
}
}
}
18.3-листинг. Конструкторли синф
Кўпинча, объектларни турли усулалр билан инициализация қилиш учун синфда бир нечта конструкторларни ташкил қилиш қулай бўлади. Барча конструкторлар турли сигнатураларга эга бўлишлари шарт.
Агар конструкторлардан бири қандйадир харакатларни амалга ошираётган, бошқаси эса яна нимадир қилаётган бўлса, у холда би ринчи конструкторни иккинчисида чақириш мақсадга мувофиқ бўлади. бунинг учун this хизматчи сўзи бошқача кўринишда ёзилади, масалан:
class Demo
{
public Demo( int a ) // 1-конструктор
{
this.a = a;
}
public Demo( int a, double y ) : this( a ) // 1-конструкторни чақириш
{
this.y = y;
}
...
}
Икки нуқта белгисидан кейин келган конструкция инициализатор деб аталади.
Маълумки, барча объектлар умумий авлод — object синфига эга эди. Агар иҳтиёрий синф конструкторида инициализатор кўрсатилмаган бўлса, у холда ўз аждоди конструкторини чақиради.
Хозиргача "оддий" конструкторлар ёки конструктор экземплярлари ҳақида фикр юритдик. Ндан ташқари конструкторларнинг яна бир типи — статик конструкторлар ёки синф конструкторлари хам мавжуд.
Экземпляр конструктори экземпляр маълумотларини, синф конструкторлари эса — синф маълумотларини инициализация қилади .
Статик конструктор параметрларга эга бўлмайди ва уларни ошкор холда чақириб хам бўлмайди. Конструкторни бажариш вақти келганини систпманиг ўзи ҳал қилади.
Айрим синфлар фақат статик маълумотлардан иборат бўлади ва демак, бундай объектларнинг экземплярларини яратиш маънога эга эмас. 2.0 версияга статик синфларни тавсифлаш имкони киритилган. Бундай синф экземплярларини яратиш таъқиқланган ва бундан ташқари улардан мерос олиш хам мумкин эмас. Бундай синф объектлари static модификатори ёрдамида ошкор холда эълон қилиниши шарт. Бунда константалар ва и ички типлар тўғридан – тўғри статик элементлар сифатида тан олинади. 18.4- листингда статик синфга намуна келтирилган.
using System;
namespace ConsoleApplication1
{
static class D
{
static int a = 200;
static double b = 0.002;
public static void Print ()
{
Console.WriteLine( "a = " + a );
Console.WriteLine( "b = " + b );
}
}
class Class1
{ static void Main()
{
D.Print();
}
}
}
18.4-листинг. Статик синф
Синфнинг турли элементлари билан ишлашни анмойиш қилувчи “елвизак” дастурда компьютер ўйинлари персонажини моддлаштирувчи синф яратамиз. Бунинг учун унинг ҳусусиятларини (масалан, пайпаслагичлар миқдори ёки гранатометнинг мавжудлиги) хамда ҳулқини белгилаб қўямиз
using System;
namespace ConsoleApplication1
{
class Monster
{
public Monster()
{
this.name = "Noname";
this.health = 100;
this.ammo = 100;
}
public Monster( string name ) : this()
{
this.name = name;
}
public Monster( int health, int ammo, string name )
{
this.name = name;
this.health = health;
this.ammo = ammo;
}
public string GetName()
{
return name;
}
public int GetHealth()
{
return health;
}
public int GetAmmo()
{
return ammo;
}
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 X = new Monster();
X.Passport();
Monster Vasia = new Monster( "Vasia" );
Vasia.Passport();
Monster Masha = new Monster( 200, 200, "Masha" );
Masha.Passport();
}
}
}
18.5-листинг. Monster синфи
Дастурнинг натижаси қуйидагича:
Monster Noname health = 100 ammo = 100
Monster Vasia health = 100 ammo = 100
Monster Masha health = 200 ammo = 200
Do'stlaringiz bilan baham: |