Umumlashgan turlar vorisligi.
Bitta umumiy sinf boshqa umumlashgandan meros bo'lishi mumkin. Bunday holda, siz meros uchun turli xil variantlardan foydalanishingiz mumkin.
Aytaylik, bizda quyidagi asosiy Person sinfi mavjud:
class Person
{
public T Id { get;}
public Person(T id)
{
Id = id;
}
}
Birinchi variant - asosiy sinf bilan bir xil turdagi terilgan hosila sinf yaratish:
class UniversalPerson : Person
{
public UniversalPerson(T id) : base(id) { }
}
Sinfga tadbiqi:
Person person1 = new Person("34");
Person person3 = new UniversalPerson(45);
UniversalPerson person2 = new UniversalPerson(33);
Console.WriteLine(person1.Id);
Console.WriteLine(person2.Id);
Console.WriteLine(person3.Id);
Ikkinchi variant - odatiy umumlashtirilmagan merosxo'r sinfini yaratish. Bunday holda, asosiy sinfdan meros bo'lib o'tayotganda, foydalaniladigan turni aniq belgilashingiz kerak:
class StringPerson : Person
{
public StringPerson(string id) : base(id) { }
}
Hosila sinf endi string turini tur sifatida ishlatadi. Sinfga murojaat qilish:
StringPerson person4 = new StringPerson("438767");
Person person5 = new StringPerson("43875");
// bunday yozib bo`lmaydi
//Person person6 = new StringPerson("45545");
Console.WriteLine(person4.Id);
Console.WriteLine(person5.Id);
Uchinchi variant esa olingan sinfni asosiy sinfdagi umumiy parametrdan mutlaqo boshqa turdagi parametr bilan yozishni ifodalaydi. Bunday holda, siz asosiy sinf uchun ishlatiladigan turni ham ko'rsatishingiz kerak:
class IntPerson : Person
{
public T Code { get; set; }
public IntPerson(int id, T code) : base(id)
{
Code = code;
}
}
Bu yerda IntPerson turi boshqa tur bo‘yicha yoziladi, u asosiy sinf ishlatadigan turga mos kelmasligi mumkin. Sinf arizasi:
IntPerson person7 = new IntPerson(5, "r4556");
Person person8 = new IntPerson(7, 4587);
Console.WriteLine(person7.Id);
Console.WriteLine(person8.Id);
Shuningdek, meros qilib olingan sinflarda siz asosiy sinfdan umumiy parametrdan foydalanishni parametrlaringiz bilan birlashtirishingiz mumkin:
class MixedPerson : Person
where K : struct
{
public K Code { get; set; }
public MixedPerson(T id, K code) : base(id)
{
Code = code;
}
}
Bu yerda asosiy sinfdan meros bo'lib qolgan T parametriga qo'shimcha ravishda yangi K parametr qo'shiladi.Shuningdek, agar cheklovlar o'rnatish zarur bo'lsa, ularni asosiy sinf nomidan keyin ko'rsatishimiz mumkin. Sinfga murojaat qilish:
MixedPerson person9 = new MixedPerson("456", 356);
Person person10 = new MixedPerson("9867", 35678);
Console.WriteLine(person9.Id);
Console.WriteLine(person10.Id);
Shuni yodda tutish kerakki, agar asosiy sinf darajasida umumiy parametr uchun cheklov o'rnatilgan bo'lsa, unda shunga o'xshash cheklash ushbu parametrdan foydalanadigan hosila sinflarida ham aniqlanishi kerak:
class Person where T : class
{
public T Id { get;}
public Person(T id) => Id = id;
}
class UniversalPerson : Person where T: class
{
public UniversalPerson(T id) : base(id) { }
}
Ya'ni, agar sinf asosiy sinfda, ya'ni har qanday sinfda cheklash sifatida ko'rsatilgan bo'lsa, hosil bo'lgan sinfda ham sinfni cheklash yoki biron bir maxsus sinfni ko'rsatish kerak.
Dostları ilə paylaş: |