CodeGym /Kurslar /C# SELF /İrsi sintaksis və base

İrsi sintaksis və base C#-da

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

1. Giriş

Bu dərsdə biz C#-da irsilik sintaksisinin necə işlədiyini araşdıracağıq: törəmə class-ları necə elan etməyi öyrənəcəyik, base açar sözünün nə olduğunu başa düşəcəyik və onun köməyi ilə parent class-a necə müraciət etməyi biləcəyik. Bu, koddan istifadə edəndə həyatını asanlaşdıracaq, proqramını daha şık edəcək (bəzən hətta əlavə yatmağa imkan verəcək — çünki copy-paste səhvlərini düzəltməyə ehtiyac qalmayacaq).

Həyatdan sadə bir nümunə: bizdə Vehicle (nəqliyyat vasitəsi) class-ı var — əsas, universal çertyoj. Bütün nəqliyyat vasitələri gedə bilir, onların rəngi, istehsalçısı və s. var:

public class Vehicle
{
    public string Brand { get; set; }
    public string Color { get; set; }

    public void Drive()
    {
        Console.WriteLine("Sürürük!");
    }
}
Əsas class Vehicle

İndi isə yeni bir nəqliyyat növü əlavə etmək istəyirik — avtomobil. Avtomobil hələ də nəqliyyat vasitəsidir, amma onun öz xüsusiyyətləri var (məsələn, qapıların sayı). Rəng və istehsalçı barədə yenidən yazmaq qəribə olardı, axı bunlar artıq müəyyən olunub!

İrsilik bizə imkan verir ki, deyək: "Avtomobil — nəqliyyat vasitəsidir, sadəcə bir sürü əlavə özəlliklərlə."

2. Necə törəmə class elan etmək olar

C#-da törəmə class yaratmaq üçün iki nöqtə : istifadə olunur. Class adından sonra hansı class-dan irs alacağımızı göstəririk.


public class Car : Vehicle
{
    public int NumberOfDoors { get; set; }
}
Törəmə class Car elan olunur

Belə oxu: Car class-ı Vehicle class-ının bütün sahə və metodlarını irs alır və özünə məxsus xüsusiyyətlər əlavə edir — məsələn, qapıların sayı.

Diqqət et: C#-da yalnız tək class irsiliyi dəstəklənir (yəni class yalnız BİR parent class-dan irs ala bilər). Amma interface-lər istədiyin qədər! (onlar barədə sonra danışacağıq).

Bu necə işləyir?

Sən belə elan edəndə:

Car myCar = new Car();

...sənin myCar obyektin həm Vehicle-in bütün sahə/metodlarına, həm də öz xüsusiyyətlərinə çıxış əldə edir. Nümunə:

myCar.Brand = "Toyota";
myCar.Color = "Mavi";
myCar.NumberOfDoors = 4;
myCar.Drive(); // İrs alınmış metod

Real ssenari:
Bizim "inkişaf edən" tətbiqimizdə nəqliyyat vasitələri menyusu edə bilərdik, istifadəçi nəqliyyat növünü seçir, proqram isə bütün xüsusiyyətlərini göstərir. Yeni nəqliyyat növü əlavə edəndə minimum kod yazacaqsan!

3. Konstruktorların irsiliyi

Törəmə class obyektləri yaradanda bəzən istəyirik ki, base class-ın xüsusiyyətlərini konstruktor vasitəsilə initialize edək. Məsələn, markanı və rəngi mütləq göstərmək üçün:


public class Vehicle
{
    public string Brand { get; set; }
    public string Color { get; set; }

    public Vehicle(string brand, string color)
    {
        Brand = brand;
        Color = color;
    }
}

İndi törəmə class-ın konstruktorunda base class-ın konstruktorunu çağırmaq olar və lazımdır! Bunun üçün base açar sözündən istifadə olunur:


public class Car : Vehicle
{
    public int NumberOfDoors { get; set; }

    public Car(string brand, string color, int numberOfDoors)
        : base(brand, color) // Vehicle konstruktorunu çağırırıq!
    {
        NumberOfDoors = numberOfDoors;
    }
}

Bu praktikada necə görünür?

Car bmw = new Car("BMW", "Qara", 4);
Console.WriteLine($"{bmw.Brand}, {bmw.Color}, qapı: {bmw.NumberOfDoors}");
bmw.Drive(); // Hələ də işləyir!

Belə çıxır ki, bmw həm avtomobildir, həm də nəqliyyat vasitəsidir. O, "valideynlərini" xatırlayır.

4. basethis fərqi

C#-da class üzvləri ilə işləmək üçün iki açar söz var: thisbase.

  • this — cari obyektə müraciət (məsələn, onun öz sahəsinə və ya metoduna).
  • basebase class üzvünə müraciət (yəni valideynə).

Nə vaxt base istifadə etməli? Təsəvvür et, base class-dan gələn metodun məntiqini genişləndirmək istəyirsən, ya da sadəcə törəmə class-dan base class-ı initialize etmək istəyirsən. Məsələn:


public class Bicycle : Vehicle
{
    public int NumberOfGears { get; set; }

    public Bicycle(string brand, string color, int gears)
        : base(brand, color)    // base class konstruktorunu çağırırıq
    {
        NumberOfGears = gears;
    }

    public void ShowInfo()
    {
        // Base class-dan gələn xüsusiyyətlərdən istifadə!
        Console.WriteLine($"{Brand} ({Color}), ötürücü: {NumberOfGears}");
    }
}

5. base açar sözü metodlarda

base — təkcə konstruktorlar üçün deyil! Bəzən istəyirsən ki, base class metodunun davranışını dəyişəsən, amma onun məntiqinin bir hissəsini istifadə edəsən.

Tutaq ki, istəyirik ki, Drive metodu Car class-ında əlavə olaraq hansı maşını sürdüyümüzü də göstərsin:


public class Car : Vehicle
{
    public int NumberOfDoors { get; set; }

    public Car(string brand, string color, int numberOfDoors) 
        : base(brand, color)
    {
        NumberOfDoors = numberOfDoors;
    }

    public void DriveCar()
    {
        base.Drive(); // base implementasiyanı çağırırıq
        Console.WriteLine($"Sürürük {Brand} {NumberOfDoors} qapı ilə!");
    }
}

İzah:
base.Drive(); çağırışı — sanki deyirsən: "Ata, əvvəlcə sən öz hekayəni danış, sonra mən əlavə edəcəm!". Nəticədə DriveCar() çağırılanda belə çap olunacaq:

Sürürük!
Sürürük BMW 4 qapı ilə!

Metodların override olunması (override) barədə növbəti dərslərdə danışacağıq :P

6. İrsilik sxemi

Gəlin class-lar arasındakı əlaqəni vizuallaşdıraq. Sadə bir sxem (çünki UML — səhərlər qorxulu olur!):

Vehicle (əsas)
   /         \
Car      Bicycle
  • Bütün oxlar TÖRƏMƏ class-dan ƏSAS class-a gedir.
  • Bütün törəmə class-lar public/protected base class üzvlərinə çıxış əldə edir.

public, protectedprivate fərqləri

Qısa xatırlatma, qarışıqlıq olmasın deyə.
Törəmə class-da görünənlər:

Modifikator Törəmədə görünür
public Bəli
protected Bəli
private Xeyr

Tez-tez rast gəlinən səhv:
Törəmədə private sahəyə müraciət etməyə çalışmaq:


public class Vehicle
{
    private string secret = "Heç kim bilməyəcək!";
}

public class Car : Vehicle
{
    public void RevealSecret()
    {
        Console.WriteLine(secret); // Səhv! Görünmür.
    }
}
private — yalnız əsas class üçün, ailə sirrləri yoxdur!

Müqayisə: əsas vs. törəmə class

Vehicle Car (törəmə)
Brand var irs alır
Color var irs alır
Drive() var irs alır (və ya genişləndirir)
NumberOfDoors yoxdur özünə məxsus (unikal xüsusiyyət)

7. Nümunə

Əgər biz sadə "Nəqliyyat uçotu" tətbiqini inkişaf etdiririk, onu belə qura bilərik:


public class Vehicle
{
    public string Brand { get; set; }
    public string Color { get; set; }

    public Vehicle(string brand, string color)
    {
        Brand = brand;
        Color = color;
    }

    public void Drive()
    {
        Console.WriteLine($"{Brand} {Color} sürdü!");
    }
}

public class Car : Vehicle
{
    public int NumberOfDoors { get; set; }

    public Car(string brand, string color, int numberOfDoors)
        : base(brand, color)
    {
        NumberOfDoors = numberOfDoors;
    }

    public void ShowCar()
    {
        Console.WriteLine($"Marka: {Brand}, Rəng: {Color}, Qapı: {NumberOfDoors}");
    }
}

public class Bicycle : Vehicle
{
    public int NumberOfGears { get; set; }

    public Bicycle(string brand, string color, int numberOfGears)
        : base(brand, color)
    {
        NumberOfGears = numberOfGears;
    }
}

Əsas metodda nəqliyyat siyahısı yaradıb müxtəlif cür təsvir edə bilərik:

Car ford = new Car("Ford", "Qırmızı", 4);
ford.ShowCar();
ford.Drive();

Bicycle trek = new Bicycle("Trek", "Yaşıl", 21);
trek.Drive();

8. Səhvlər, xüsusiyyətlər və bir az yumor

Çox tez-tez rast gəlinən səhv — törəmədə base konstruktorunu çağırmağı unutmaq. Əgər Vehicle-da parametrsiz konstruktor yoxdursa və sən base(...) çağırmadınsa, kompilyator səhv verəcək: baza initialize oluna bilmir. Bu, birinci mərtəbə olmadan ikinci mərtəbə tikməyə bənzəyir. Alınmır. Məlumatı yuxarı ötürmək lazımdır.

İkinci səhv: base class-da private ilə elan olunan sahə/metodların törəmədə GÖRÜNMƏDİYİNİ unutmaq. "Uşaqlara" nəsə vermək istəyirsənsə, protected istifadə et (bu barədə ətraflı — növbəti dərslərdə).

Və ən əsası: irsilik — rahat şeydir, amma çox dolaşıq iyerarxiyalar qurmağa dəyməz. Real həyatda, əgər sənin irsilik zəncirin iki-üç səviyyədən çoxdursa, yəqin ki, nəsə düz getmir. Kim kimdən irs alıb, niyə belə olub — asanlıqla qarışa bilər.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION