CodeGym /Kurslar /C# SELF /Siniflər və obyektlər: yaradılması, konstruktorlar və ini...

Siniflər və obyektlər: yaradılması, konstruktorlar və inisializasiya

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Obyektin yaradılması

Bax, artıq obyektlərin yaradılmasına gəlib çatdıq. Sən bununla artıq rastlaşmışdın, sadəcə indi bu mövzunu bir az daha detallı müzakirə edəcəyik. Əslində obyekt yaratmaq çox asandır.

Obyekt yaratmaq üçün new operatorundan istifadə etmək lazımdır. Adətən sən yeni bir class nümunəsi (obyekt) yaradırsan və onu həmin tipdə bir dəyişənə saxlayırsan.

Sinif ad = new Sinif(parametrlər);
Obyektin yaradılması sintaksisi

Burada Sinif — obyektin tipi, ad — dəyişənin adı (adətən kiçik hərflə, məsələn cat), və = sağında isə həmin sinifin yeni obyektinin yaradılmasıdır.

Nümunələr:

Kod Qeyd
object o = new object();
object tipində obyektin yaradılması
Cat pet = new Cat();
Cat tipində obyektin yaradılması
var reader = new StreamReader("file.txt");
Parametr ilə StreamReader obyektinin yaradılması

Çox vaxt proqramçılar dəyişənləri sinifin adı ilə eyni adlandırırlar, sadəcə kiçik hərflə. Yeni başlayan proqramçı üçün belə kod bir az qarışıq görünə bilər:

Kod
Student student = new Student();
Car car = new Car();
PersonInfo personInfo = new PersonInfo();

Əslində bu kodda heç bir qorxulu şey yoxdur — bu ən adi koddur, burada dəyişən yaradılır və dərhal həmin tipdə obyektlə inisializasiya olunur.

Solda — dəyişənin elan olunması, sağda — new ilə yaddaşda yeni obyektin yaradılması. Hamısı bu qədər!

2. Konstruktor

Yəqin tez-tez görmüsən ki, obyekt yaradanda ona hansısa parametrlər ötürülür. Bəzən obyektə parametrlər ötürülür, bəzən isə yox. Ümumiyyətlə bu parametr mexanizmi necə işləyir?

Burada da hər şey sadədir: hər bir class-da xüsusi metod (və ya metodlar) var ki, obyekt yaradılarkən parametrləri emal edir. Belə metodlara konstruktorlar deyilir. Bir metod isə, müvafiq olaraq, konstruktor adlanır.

Konstruktor metodunu adi metoddandan ayırmaq çətin deyil. Belə metodun iki xüsusiyyəti var:

  • konstruktor metodunun adı sinifin adı ilə eyni olur (və böyük hərflə başlayır)
  • konstruktor metodu heç bir qaytarılan tipə sahib olmur (hətta void da yazılmır).

Onun ümumi görünüşü adətən belə olur:


modifikatorlar Sinif(parametrlər)
{
   konstruktorun kodu
}
Konstruktorun sintaksisi

Konstruktorun elan olunması nümunəsi:

public class Point
{
    public int X;
    public int Y;

    public Point(int x, int y) // Konstruktor
    {
        X = x;
        Y = y;
    }
}

İstifadə:

Point p = new Point(5, 10); // Konstruktorun çağırılması

Obyekt new Point(5, 10) ilə yaradılarkən iki parametrli konstruktor çağırılacaq və XY sahələri inisializasiya olunacaq.

Bəzən konstruktorun parametrləri sahələrlə eyni adlara malik olur — rahatlıq üçün. Belə ad konflikti this açar sözü ilə həll olunur:

public Point(int x, int y)
{
    this.x = x; // this.x — obyektin sahəsi, x — konstruktorun parametri
    this.y = y;
}

3. Konstruktorun çağırılması

Sən new Sinif(parametrlər) yazanda, C#:

  • yaddaşda yeni obyekt yaradır,
  • sənin parametrlərini ötürərək uyğun konstruktoru çağırır.

Pişik class-ı ilə nümunə:

public class Cat
{
    public string Name;
    public int Age;

    public Cat(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

İstifadə:

Cat cat = new Cat("Vaska", 2); // Olar: iki parametrli konstruktor çağırılır
Cat cat2 = new Cat("Vaska");   // Olmaz: belə konstruktor yoxdur — kompilasiya xətası
Cat cat3 = new Cat();          // Olmaz: parametrsiz konstruktor yoxdur — kompilasiya xətası

Əgər class-da yalnız parametrli konstruktor varsa, obyekt yaradanda mütləq həmin parametrləri ötürməlisən.

4. Bir neçə konstruktor

Amma əgər sənə lazımdırsa, class-a bir neçə konstruktor əlavə edə bilərsən. Konstruktorların və onların parametrlərinin sayı üçün heç bir məhdudiyyət yoxdur. Obyekt yaradanda kompilator özü parametrlərə uyğun konstruktoru seçəcək.

Nümunə:

public class Cat
{
    public const int UNKNOWN = -1;
    public string Name;
    public int Age;

    public Cat(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public Cat(string name)
    {
        Name = name;
        Age = UNKNOWN; // Naməlum yaş üçün "default" dəyər
    }
}

İstifadə:

Cat cat1 = new Cat("Vaska", 2); // Birinci konstruktor istifadə olunur
Cat cat2 = new Cat("Murka");    // İkinci konstruktor istifadə olunur
Cat cat3 = new Cat();           // Xəta! Parametrsiz konstruktor yoxdur

Biz qərara gəldik ki, pişiyin yaşı naməlum ola bilər. Bu halda koda xüsusi bir sabit — UNKNOWN əlavə etdik və yalnız ad qəbul edən konstruktor yazdıq.

Diqqət et ki, hər iki konstruktorun içində də class dəyişənlərini inisializasiya edirik. Naməlum/olmayan parametrləri UNKNOWN sabiti ilə əvəz edirik.

5. Default konstruktor

Əgər class-da heç bir konstruktor yoxdursa, kompilator avtomatik olaraq parametrsiz boş konstruktor əlavə edəcək:


public ClassName()
{
}
Default konstruktorun sintaksisi

Amma class-da artıq ən azı bir konstruktor varsa — avtomatik olaraq boş konstruktor artıq əlavə olunmur.

Nümunə 1:

public class Cat
{
    public string Name;
    public int Age;
}

// Olar:
Cat cat = new Cat(); // Default konstruktor (parametrsiz) çağırılacaq

Nümunə 2:

public class Cat
{
    public string Name;
    public int Age;

    public Cat(string name) { Name = name; }
}

// Olmaz:
Cat cat = new Cat(); // Xəta: parametrsiz konstruktor artıq yoxdur!

6. Dəyişənlərin inisializasiyası

C#-da class dəyişənlərini ya birbaşa elan zamanı, ya da konstruktorun içində inisializasiya etmək olar.

Nümunə:

public class Cat
{
    public string Name;
    public int Age = -1; // Başlanğıc dəyər

    public Cat(string name, int age)
    {
        Name = name;
        Age = age; // Başlanğıc dəyəri yenidən yazır
    }

    public Cat()
    {
        Name = "Adsız";
        // Age -1 olaraq qalır (başlanğıc dəyər)
    }
}

İzah:

  • new Cat("Vaska", 2) ilə yaradanda Age əvvəlcə -1 olacaq, amma konstruktor ona 2 verəcək.
  • new Cat() ilə yaradanda isə Age -1 olaraq qalacaq.

7. Dəyişənlərin inisializasiya qaydası

Yeni obyektin məlumatları belə ardıcıllıqla inisializasiya olunur:

  1. Class sahələri əvvəlcə default dəyərlər alır (0 üçün int, null üçün referans tiplər və s.).
  2. Sonra sahələrin elanında yazdığın inisializatorlar, kodda göründüyü ardıcıllıqla işləyir.
  3. Və yalnız bundan sonra konstruktorun kodu işləyir.

Dəyişənlər konstruktordan əvvəlelan olunduğu ardıcıllıqla inisializasiya olunur. Ona görə sahələr arasındakı asılılıqlara diqqət et.

Səhv nümunə

Qeyri-statik sahələri qeyri-statik dəyişənlərlə inisializasiya etmək olmaz:


public class Solution
{
    public int a = 1; 
    public int b = a;        // a istifadə etmək olmaz
    public int c = a + b;   // a və b istifadə etmək olmaz
}
// Belə kod kompilasiya xətası verəcək!
Xəta: qeyri-statik sahələr inisializasiya zamanı bir-birinə istinad edə bilməz

Düzgün nümunə

Statik dəyişənlər üçün hər şey işləyəcək:

public class Solution
{
    public static int a = 1;          // a = 1 açıq şəkildə verilir
    public static int b = a + 2;      // b = 1 + 2 ⇒ 3
    public static int c = a + b + 3;  // c = 1 + 3 + 3 ⇒ 7

    public Solution()
    {
        Console.WriteLine($"a = {a}, b = {b}, c = {c}");
        // Çap edəcək: a = 1, b = 3, c = 7 — məhz gözlənilən kimi
    }
}
Statik sahələrin inisializasiyası

Düzgün nümunə 2

Statik sahələr üçün hətta belə də yazmaq olar:

public class Solution
{
    public static int a = b + c + 1;    // b və c hələ 0-dır
    public static int b = a + c + 2;    // a == 1, c hələ 0-dır
    public static int c = a + b + 3;    // a == 1, b == 3
}
Statik sahələr və onların inisializasiya ardıcıllığı
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION