1. Giriş
Proqramlaşdırmada irsilik real həyatda olan irsiliyə çox bənzəyir. Məsələn, sən valideynlərindən göz rəngini, burun formasını və ya hətta rəsm çəkmək istedadını miras ala bilərsən. Bu xüsusiyyətləri "default olaraq" alırsan və onları sıfırdan yaratmağa ehtiyac yoxdur. Amma bununla yanaşı, sən özünə məxsus unikal xüsusiyyətləri də inkişaf etdirə bilərsən, hansı ki, valideynlərində yoxdur.
Proqramlaşdırmada bu eyni cür işləyir:
- Bir class (biz ona baza class və ya valideyn class, bəzən də superclass deyəcəyik) bütün "övladlarında" olan ümumi xüsusiyyətləri (property-lər) və davranışları (method-ları) müəyyən edir.
- Başqa bir class (ona törəmə class və ya uşaq class, bəzən də subclass deyilir) miras alır bütün bu ümumi xüsusiyyətləri valideynindən. O, avtomatik olaraq bütün public və protected property və method-ları baza class-dan alır. Onları yenidən elan etməyə ehtiyac yoxdur.
- Bununla yanaşı, törəmə class özünə məxsus, unikal property və method-lar əlavə edə bilər, hansı ki, valideyn class-da yoxdur.
- Bəzən törəmə class hətta dəyişə bilər miras alınan method-ların davranışını (amma bu barədə növbəti mühazirələrdə danışacağıq, buna polimorfizm deyilir).
İrsiliyin əsas konsepsiyası "nədirsə" (is-a relationship) ifadəsi ilə göstərilir. Təsəvvür elə ki, sən öz oyununu yazırsan və orada mag, döyüşçü və oxçu var:
- Döyüşçü nədir Personaj.
- Mag nədir Personaj.
- Oxçu nədir Personaj.
Əgər Döyüşçü Personaj-dırsa, deməli onda Personaj-da olan hər şey olmalıdır, üstəlik Döyüşçü-yə məxsus nəsə unikal bir şey də ola bilər.
2. İrsiliyin sintaksisi
Gəlin bir nümunəyə baxaq və bir az kod yazaq.
Sintaksisin əsasları
// Baza class
public class Heyvan
{
public string Name { get; set; }
public void Move()
{
Console.WriteLine($"{Name} hərəkət edir.");
}
}
// Uşaq class
public class It : Heyvan
{
public void Bark()
{
Console.WriteLine($"{Name} hürür: Hav!");
}
}
Diqqət yetir ":" işarəsinə It class adından sonra. Burada deyirik ki: It miras alır Heyvan-da olan hər şeyi.
Bütün public və protected olanlar Heyvan-da, It-də də olacaq!
İrsiliyin istifadəsi
Bu class-lardan konsol tətbiqimizdə istifadə edək:
var dog = new It();
dog.Name = "Şarik"; // Name property-si Heyvan-dan miras alınıb
dog.Move(); // Move method-u Heyvan-dan miras alınıb
dog.Bark(); // It-ə məxsus method
// Çıxış:
// Şarik hərəkət edir.
// Şarik hürür: Hav!
Bir də pişik yarada bilərik, "zoopark"ı bir az rəngləyək:
public class Pişik : Heyvan
{
public void Meow()
{
Console.WriteLine($"{Name} miyoldayır: Miyau!");
}
}
var cat = new Pişik();
cat.Name = "Murka";
cat.Move();
cat.Meow();
3. İrsilik necə əziyyəti azaldır
Əgər bir neçə oxşar obyektin varsa, kodu təkrar-təkrar kopyalamağa ehtiyac yoxdur. İrsilik elə bil master-kopiyadır: sən bir dəfə məntiqi yazırsan, bütün övladlar onu alır.
Vizualizasiya: İrsilik ağacı
. Heyvan
/ \
It Pişik
| Class | Name property-si | Move method-u | Öz method-u |
|---|---|---|---|
| Heyvan | + | + | - |
| It | + | + | Bark() |
| Pişik | + | + | Meow() |
Başqa bir nümunə — tətbiqin genişləndirilməsi
Təsəvvür elə ki, müxtəlif insan tiplərini qeydiyyata almaq üçün sistem yaratmaq istəyirsən. Köhnə yanaşmanı xatırla:
public class Shexs
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
// İndi işçi əlavə edək
public class Isci
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Position { get; set; }
}
Çox rahat deyil! Ad məlumatları təkrarlanır. İrsiliklə bunu düzgün etmək olur:
public class Shexs
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Isci : Shexs
{
public string Position { get; set; }
}
public class Telebe : Shexs
{
public int Grade { get; set; }
}
İndi Isci və Telebe-də artıq FirstName və LastName var — ikinci dəfə yazmağa ehtiyac yoxdur. İndi asanlıqla sistemi müxtəlif rollar üçün genişləndirə bilərsən.
Bax, irsiliyin magiyası budur: biz ümumi xüsusiyyətləri bir dəfə baza class-da təsvir etdik, sonra isə sadəcə törəmə class-larda funksionallığı "genişləndirdik", spesifik detallar əlavə etdik.
4. İrsiliyin üstünlükləri
Kodun təkrar istifadəsi (Code Reusability): Ən aydın üstünlük budur. Eyni kodu bir neçə yerdə yazmağa ehtiyac yoxdur. Bir dəfə yazdın — çox yerdə istifadə etdin. Kodun daha qısa və təmiz olur (proqramlaşdırmada deyirlər "Don't Repeat Yourself" — DRY, "Özünü təkrarlama").
Dəstəkləmənin asanlaşması (Easier Maintenance): Əgər hərəkət məntiqini dəyişmək lazımdırsa, onu yalnız bir yerdə — baza class Heyvan-da dəyişirsən. Bütün törəmə class-lar avtomatik olaraq bu dəyişikliyi alır. Böyük layihədə bunun nə qədər vaxt qazandıracağını təsəvvür elə!
Iyerarxiyaların yaradılması (Creating Hierarchies): İrsilik real dünyada "nədirsə" münasibətlərini modelləşdirməyə imkan verir, məntiqli və başa düşülən strukturlar yaradır. Döyüşçü nədir Personaj, Mag nədir Personaj. Bu, kodunu daha strukturlaşdırılmış və başa düşülən edir.
Polimorfizm üçün əsas: Hələ polimorfizmi ətraflı öyrənməmişik, amma irsilik onun təməlidir. Polimorfizm sənə müxtəlif törəmə class obyektləri ilə, baza class-ın ümumi interfeysindən istifadə edərək işləməyə imkan verir. Məsələn, sən bütün Heyvan-ları (istər It, Pişik və ya başqa heyvanlar olsun) siyahıda saxlaya və onların Move method-un çağırışını edə bilərsən, hər heyvanın konkret tipi barədə düşünmədən. Bu çox güclü bir şeydir və biz mütləq buna qayıdacağıq!
5. İrsiliyin incəlikləri və xüsusiyyətləri
C#-da tək irsilik: Bəzi başqa dillərdən (məsələn, C++) fərqli olaraq, C# yalnız tək irsiliyi dəstəkləyir. Yəni, bir class yalnız bir baza class-dan miras ala bilər. Sən eyni anda həm Heyvan, həm də, məsələn, Vehicle (belə bir class olsa) miras ala bilməzsən.
Bütün class-lar avtomatik olaraq object-dən miras alır: Maraqlı fakt! Əgər baza class-ı açıq şəkildə göstərmirsənsə, sənin class-ın avtomatik olaraq System.Object-dən miras alır. Bu, .NET-də ən baza class-dır və bəzi fundamental method-lar verir, məsələn, ToString(), Equals(), GetHashCode(). Yəni, sən class-larda ToString()-i override edəndə, əslində object-dən miras alınan method-u override edirsən!
Konstruktorlar miras alınmır: Törəmə class baza class-ın konstruktorlarını miras almır. Konstruktorları törəmə class-da açıq şəkildə müəyyən etməlisən. Amma əgər baza class-da parametrli konstruktor varsa, sən MÜTLƏQ törəmə class-ın konstruktorundan baza class-ın konstruktorunu çağırmalısan. Bu, base açar sözü ilə edilir.
Private üzvlər əlçatan deyil: private baza class-ın üzvləri törəmə class-dan birbaşa əlçatan deyil. Onlar obyektin içində var, amma törəmə class kodundan adla müraciət edə bilməzsən. Əgər üzvlərin törəmə class-lar üçün əlçatan, amma bütün dünya üçün əlçatan olmasını istəyirsənsə, protected access modifier-dən istifadə et.
6. İyerarxiyanın vizualizasiyası
İrsilik münasibətlərini daha yaxşı başa düşmək üçün tez-tez diaqramlardan istifadə olunur. Ən məşhurlarından biri — UML (Unified Modeling Language) class diaqramıdır. Heyvanlarla sadə nümunə üçün belə görünərdi:
classDiagram
class Heyvan {
+ string Name
+ Move()
}
class It {
+ Bark()
}
class Pişik {
+ Meow()
}
Heyvan <|-- It : inherits
Heyvan <|-- Pişik : inherits
Bu diaqramda boş üçbucaqlı ox (It-dən Heyvan-a, Pişik-dən Heyvan-a) irsilik münasibətini göstərir: "nədirsə" (is-a relationship).
7. İrsiliyin praktik tətbiqi
İrsilik sadəcə akademik konsepsiya deyil, müasir proqramlaşdırmanın sütunlarından biridir və real layihələrdə geniş istifadə olunur:
Qrafik interfeys hazırlanması (GUI): WPF, WinForms, MAUI (.NET üçün desktop tətbiqlər üçün framework-lər) kimi yerlərdə, demək olar ki, bütün idarəetmə elementləri (düymələr, mətn sahələri, pəncərələr) ümumi baza class Control və ya UIElement-dən miras alır. Bu, onlara ölçü, mövqe, görünürlük kimi ümumi property-lər və hadisə işləmə kimi ümumi method-lar verir.
Məsələn, Button nədir Control, TextBox nədir Control.
Oyun mühərrikləri: İrsilik oyun obyektlərinin iyerarxiyasını yaratmaq üçün idealdır: GameObject → Character → Player/Enemy və ya Vehicle → Car/Motorcycle.
Verilənlər bazası ilə iş (ORM): Entity Framework Core kimi framework-lərdə tez-tez bütün entity-lərin üçün baza class təyin edirsən, məsələn, BaseEntity, orada Id (bazada qeydiyyat identifikatoru) və ya CreatedAt (qeydiyyatın yaradılma tarixi) kimi property-lər olur. Bütün konkret entity-lərin (User, Product, Order) BaseEntity-dən miras alır və bu property-ləri avtomatik əldə edir.
Testləşdirmə: İrsilik test framework-lərində (məsələn, xUnit, NUnit) istifadə olunur, burada ümumi init və təmizləmə məntiqi olan baza test class-ları yarada bilərsən və onlardan konkret test class-lar miras alır.
Kitabxanalar və framework-lər: .NET-in standart kitabxanası özü də irsiliyi geniş istifadə edir. Məsələn, bir çox kolleksiya və tiplər ümumi baza class-lardan miras alır və ya ümumi interfeysləri implement edir (bunu sonra danışacağıq).
C# və .NET üzrə müsahibələrdə irsilik, onun prinsipləri (DRY, "is-a"), eləcə də digər konsepsiyalardan fərqləri (məsələn, kompozisiya və ya interfeyslər) barədə suallar əsasdır və çox tez-tez rast gəlinir. Sadəcə nə olduğunu danışmaq yox, həm də real həyatdan və ya koddan nümunələr gətirmək bacarığı çox dəyərlidir.
Gördüyün kimi, irsilik sadəcə dilin "feyşn" bir xüsusiyyəti deyil, kodu strukturlaşdırmaq, təkrarı azaltmaq və məntiqi əlaqəli sistemlər yaratmaq üçün güclü bir alətdir. Bu, miqyaslana bilən və dəstəklənən kod yazmağın açarıdır.
GO TO FULL VERSION