C#-da class-lar arasında miras alıb-verilməni " : " (qoşaq nöqtə) operatoru ilə həyata keçiririk. Təbii ki, hər gördüyümüz " : " işarə Inheritence ilə bağlı deyil. Başqa mövzularda da istifadə olunur.
Aşağıda gördüyünz kod sətirləri Inheritence(miras) xüsusiyyətinin təyin edilməsdinə aid sadə bir kod nümunəsdir.
public class Drive : Base
{
}
Tətbiqi isə aşağıdakı nümunədə gördüyünüz kimdir. Miras verən əsas class Base(Parent), miras alan törəmiş class isə Drive(Child) class kimi adlandırılır. Aşağıda da Drive class Base class-dan miras alaraq onun sahib olduğu xüsusiyyətləri özünə tətbiq edir. Artıq Drive class da Base class-ın sahib oluduğu "Public" xüsusiyyətlərə sahibdir. Bunu ola bilər fiziki olaraq görə bilmirik, amma Drive class-dan instance alanda nöqtə qoyub obyektin member-lərini çağırmaq istədikdə Base class-ın sahib olduğu Public xüsusiyyətlərin də orda olduğunu müşahidə edəcəyik. Yəni fiziki olaraq görünməsini gözləməyin. Görünsə zatən manual yazılıb deməkdir. Bu da Inheritence deyil. Dolayısı ilə Base class-dakı "Private" xüsusiyyətləri burada görməyəcəyik, onlara kənardan access-miz yoxdur
Növbədə base və drive class-ların nə anlama gəldiyinə aydınlıq gətirməkdir. Belə ki, base class digər siniflərin miras alındığı əsas sinifdir. Bu sinif adətən daha ümumi və ya mücərrəd anlayışı təmsil edir. Məsələn, "User" sinfi base class ola bilər, çünki o, ümumi olaraq istifadəçini təmsil edir və bu class-da ümumi xüsusiyyətlər və davranışlar müəyyən edilməlidir.
public class User
{
public string UserName { get; set; }
public string Email { get; set; }
}
Törəmə class, əsas clas-dan miras alan(varis) və adətən daha çox ixtisaslaşmış və ya müəyyən bir məqsədi olan bir sinifdir. Məsələn, "Admin" class-ı "User" class-dan miras ala bilər və eyni zamanda əlavə xüsusiyyətlərə və ya davranışlara da malik ola bilər.
public class Admin : User
{
public bool IsAdministrator { get; set; }
// Əlavə xüsusiyyətlər və davranışlar əlavə oluna bilər.
}
Yuxarıdakı misalda “Admin” sinfi “User” class-dan miras almaqla avtomatik olaraq “UserName” və “Email” xassələrini ehtiva edir. "Admin" class-a həmçinin "IsAdministrator" adlı yeni xüsusiyyət əlavə edə bilər necə ki artıq etmişik. Bu class iyerarxiyası kodunuzu daha modul və davamlı edir, çünki ümumi xassələr və davranışlar "User" sinfində müəyyən edilə və "Admin" kimi törəmə siniflərə daha spesifik hallar əlavə etməklə genişləndirilə bilər.
Bunu daha aydın izah etmək üçün başqa bir nümunəyə nəzər yetirək. A bizdə B-nin Base class-ı dır və o sahib olduğu Public xüsusiyyətləri özündən miras alan bütün class-lara o cümlədən B-ə ötürür və sadəcə özündən birbaşa miras alan class-lar üçün Base class hesab olunur. Yəni A-dan miras alan B class-dan C class-ı əgər miras alsa C class-nın base class-ı A yox B olacaq. A dolayısı ilə C-nın atalarından hesab oluna bilər ama birbaşa ondan miras almadığı üçün Base-i hesab olunmur. Xülasə, bir class o zaman Base hesab olunur ki, onda birbaşa miras alınsın. Bir class-ın sadəcə bir base class-ı ola bilər o da birbaşa miras aldığı class-dır. Bir sinfin birdən çox drive class-ı ola bilər. Məsələn, B və D A-nın Drive class-larıdır. Bir atanın birdən çox övladı ola bilər, amma bu öladların birdən çox atası ola bilməz. Yalnız bir atası ola bilər. Gördüyünüz kimi koddakı hər şey real həyatı simulasiya edir. Bir class istənilən class-dan miras alırsa bu zaman avtomatik o Drive class hesab olunur.
public class A
{
public string Parametr_A_1 { get; set; }
string Parametr_A_2 { get; set; }
}
public class B : A
{
public string Parametr_B { get; set; }
}
public class C : B
{
public string Parametr_C { get; set; }
}
public class d : A
{
public string Parametr_C { get; set; }
}
namespace Blogs.Blog_1
{
public class Progam
{
public static void Main(string[] args)
{
C c_object = new();
c_object.
}
}
}
Bəli, yuxarıdakı kod nümunəsinə yenidən nəzər salsaq bir class eyni zamanda həm base həm də drive hesab oluna bilər. Məsələn elə aşağıdakı B class-ı A-dan miras aldığı üçün Drive, C-ə miras verdiyi üçün C class-nın Base class-ı hesab olunur.
Bir sinifdən obyekt yaradılarkən miras aldığı üst sinif varsa ilk olaraq həmin class-dan sıra ilə obyekt yaradılır ən sonda sıra ona gəlir. Məsələn, yuxarıdakı A,B,C nümunəsinə yenidən nəzər yetirək. C class-dan obyekt yaratdığımızda birinci Compiler arxa planda onun Base class-dan obyekt yaradır. Bunun üçün Compiler lori dildə desək yuxarıya doğru, ən sonuncu class-a qədər soruşa-soruşa çıxır, əgər Base class-ı özü də hansısa class-dan miras alıbsa hətta birinci gedib onu tapır. Ən birinci ondan bir obyekt yaradaraq aşağıya, bizim yaratdığımız class-a düşür. Ən sonda onda obyelt yaradır. Məsələ yuxarıdan-aşağı ierarxik baş verir. Bu class-ların constructor-larına dəyər də göndərə bilərik. Yəni biz class-dan bir obyekt yaratdığımızı düşünsək də arxa planda obyektini yaratdığınmız class-ın neçə dənə ieararxik atası varsa Ram-ın Heap bölməsində o sayda obyekt yaradılır.