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.
Do'stlaringiz bilan baham: |