C#’da virtual metodlar va xossalar
Ko’p hollarda bir klassdan meros olishda bola klass ichida ota klass metod funksiyasini o’zgartirishga to’g’ri keladi. Bu holatda bola klass ota klass metod va xossalarini qayta e’lon qilishi mumkin.
Bola klassda qayta e’lon qilinishi kerak bo’lgan metod va xossalarni ota klassda
virtual modifikatori bilan belgilanadi. Bunday metod va xossalar virtual deb aytiladi.
Metodni bola klass ichida qayta e’lon qilish
override modifikatori orqali amalga oshiriladi. Bola klassda qayta e’lon qilinayotgan metod ota klassdagi kabi kiruvchi parametrlarga ega bo’lishi shart.
Quyida shunday klassni ko’rish mumkin:
class Person { public string Name { get; set; } public Person(string name) { Name = name; } public virtual void Display() { Console.WriteLine(Name); } } class Employee : Person { public string Company { get; set; } public Employee(string name, string company) : base(name) { Company = company; } }
Bu kodda Person klassi odamni ifodalaydi. Employee klassi Person klassidan meros oladi va u korxona ishchisini ifodalaydi. Employee klassi ota klassdan meros olgan Name xossasidan tashqari Company xossasiga ham ega.
Display metodini bola klassda qayta e’lon qilish mumkin bo’lishi uchun ota klassda u virtual modifikatori bilan belgilangan. Bunda bola klassda bu metodni qayta e’lon qilish majburiy emas. Deylik, ota klass imkoniyatlari bizga yetarli. Bunda Employee’ning obyektlari Person klassdagi Display metodini qo’llaydi.
static void Main(string[] args) { Person p1 = new Person("Bill"); p1.Display(); // Person klassidagi Display metodi chaqirilmoqda Employee p2 = new Employee("Tom", "Microsoft"); p2.Display(); // Person klassidagi Display metodi chaqirilmoqda Console.ReadKey(); }
Konsoldagi natija:
Bill Tom
Lekin virtual metodni qayta e’lon qilish ham mumkin. Buning uchun bola klassda qayta e’lon qilinishi kerak bo’lgan metod override modifikatori bilan belgilanadi, bunda u ota klassdagi kabi parametrlarga ega bo’lishi zarur:
class Employee : Person { public string Company { get; set; } public Employee(string name, string company) : base(name) { Company = company; } public override void Display() { Console.WriteLine($"{Name} {Company}da ishlaydi"); } }
Endi aynan yuqoridagi obyekt olinsa:
static void Main(string[] args) { Person p1 = new Person("Bill"); p1.Display(); // Person klassidagi Display metodi chaqirilmoqda Employee p2 = new Employee("Tom", "Microsoft"); p2.Display(); // Employee klassidagi Display metodi chaqirilmoqda Console.ReadKey(); }
Konsoldagi natija:
Bill Tom Microsoftda ishlaydi
Ota klass virtual metodi butun tuzilmani ko’rinishini aniqlaydi. Ya’ni shu ota klassdan to’g’ridan-to’g’ri meros olmasdan hosil qilingan ota klass avlodlarida virtual metodni qayta e’lon qilish mumkin. Masalan, Manager klassini tuzish mumkin, u Employee klassidan meros olishi mumkin. Va unda Display metodi qayta e’lon qilinishi mumkin.
Virtual metodlarni qayta e’lon qilishda bir nechta cheklovlarni hisobga olish kerak:
- Virtual va qayta e’lon qilingan metodlar bir xil ruxsat modifikatori bilan belgilangan bo’lishi kerak, ya’ni, agar virtual metod public modifikatori bilan e’lon qiligan bo’lsa, avlod klasslarda shu metod public modifikatori bilan qayta e’lon qilinishi kerak;
- Static metodlarni virual modifikatori bilan e’lon qilish yoki qayta e’lon qilish mumkin emas.
Xossalarni qayta e’lon qilish
Metodlar kabi xossalarni ham qayta e’lon qilish mumkin:
class Credit { public virtual decimal Sum { get; set; } } class LongCredit : Credit { private decimal sum; public override decimal Sum { get { return sum; } set { if(value > 1000) { sum = value; } } } } class Program { static void Main(string[] args) { LongCredit credit = new LongCredit { Sum = 6000 }; credit.Sum = 490; Console.WriteLine(credit.Sum); Console.ReadKey(); } }
base kalit so’zi
Konstruktorlardan tashqari base kalit so’zi orqali ota klassning boshqa elementlariga murojaat qilish mumkin. Bizning holda base.Display(); Person klassdagi Display metodi chaqiriladi:
class Employee : Person { public string Company { get; set; } public Employee(string name, string company) :base(name) { Company = company; } public override void Display() { base.Display(); Console.WriteLine($"{Company}da ishlaydi"); } }
Metodlarni qayta e’lon qilishni taqiqlash
Ba’zi hollarda qayta e’lon qilishni taqiqlash zarur bo’lishi mumkin. Bunda sealed modifikatoridan foydalanish kerak bo’ladi:
class Employee : Person { public string Company { get; set; } public Employee(string name, string company) : base(name) { Company = company; } public override sealed void Display() { Console.WriteLine($"{Name} {Company}da ishlaydi"); } }
sealed modifikatori bilan yaratilinadigan metodlarda bir jihat inobatga olish kerak, sealed faqatgina override bilan birga qo’llanilishi mumkin. Ya’ni sealed’dan faqat qayta e’lon qilinayotgan metodlarda foydalanish mumkin. Va bunda Employee klassdan meros olgan klasslarda Display metodini qayta e’lon qila olmaymiz.
Manba:
Umumiy Dasturlash
C#’da virtual metodlar va xossalar