• 4. Umumiy turdagi meros
  • 1. System. Object sinfi va uning usullari Umumlashtirish




    Download 70,5 Kb.
    bet9/12
    Sana18.05.2024
    Hajmi70,5 Kb.
    #241174
    1   ...   4   5   6   7   8   9   10   11   12
    Bog'liq
    22-09

    Usul cheklovlari. Usul cheklovlari xuddi shunday tarzda ishlatilishi mumkin:
    private static void Main(string[] args)
    {
    Account acc1 = new Account(1857) { Sum = 4500 };
    Account acc2 = new Account(3453) { Sum = 5000 };
    Transact(acc1, acc2, 900);
    Console.Read();
    }
    public static void Transact(T acc1, T acc2, int sum) where T : Account
    {
    if (acc1.Sum > sum)
    {
    acc1.Sum -= sum;
    acc2.Sum += sum;
    }
    Console.WriteLine($"acc1: {acc1.Sum} acc2: {acc2.Sum}");
    }
    Transact usuli cheklash sifatida Account turini oladi.

    4. Umumiy turdagi meros
    Bitta umumiy sinf boshqa umumlashgandan meros bo'lishi mumkin. Bunday holda, siz meros uchun turli xil variantlardan foydalanishingiz mumkin.
    Aytaylik, bizda quyidagi asosiy Account sinfi mavjud:
    class Account
    {
    public T Id { get; private set; }
    public Account(T _id)
    {
    Id = _id;
    }
    }
    Birinchi variant - asosiy sinf bilan bir xil turdagi terilgan hosila sinf yaratish:

    class UniversalAccount : Account
    {
    public UniversalAccount(T id) : base(id)
    {
    }
    }
    Sinfga murojaat qilish:

    Account acc1 = new Account("34");
    Account acc3 = new UniversalAccount(45);
    UniversalAccount acc2 = new UniversalAccount(33);
    Console.WriteLine(acc1.Id);
    Console.WriteLine(acc2.Id);
    Console.WriteLine(acc3.Id);
    Ikkinchi variant - odatiy umumlashtirilmagan merosxo'r sinfini yaratish. Bunday holda, asosiy sinfdan meros bo'lib o'tayotganda, foydalaniladigan turni aniq belgilashingiz kerak:

    class StringAccount : Account
    {
    public StringAccount(string id) : base(id)
    {
    }
    }
    Olingan sinf endi string turini tur sifatida ishlatadi. Sinfga murojaat qilish:

    StringAccount acc4 = new StringAccount("438767");
    Account acc5 = new StringAccount("43875");
    // siz bunday yozolmaysiz
    //Account acc6 = new StringAccount("45545");
    Uchinchi variant esa olingan sinfni asosiy sinfdagi umumiy parametrdan mutlaqo boshqa turdagi parametr bilan yozishni ifodalaydi. Bunday holda, asosiy sinf uchun ishlatiladigan tur ham ko'rsatilishi kerak:

    class IntAccount : Account
    {
    public T Code { get; set; }
    public IntAccount(int id) : base(id)
    {
    }
    }
    Bu yerda IntAccount turi boshqa tur bilan yoziladi, u asosiy sinf tomonidan ishlatiladigan turga mos kelmasligi mumkin. Sinfga murojaat qilish:

    IntAccount acc7 = new IntAccount(5) { Code = "r4556" };
    Account acc8 = new IntAccount(7) { Code = 4587 };
    Console.WriteLine(acc7.Id);
    Console.WriteLine(acc8.Id);
    Shuningdek, meros qilib olingan sinflarda siz asosiy sinfdan umumiy parametrdan foydalanishni parametrlaringiz bilan birlashtirishingiz mumkin:

    class MixedAccount : Account
    where K : struct
    {
    public K Code { get; set; }
    public MixedAccount(T id) : base(id)
    {
    }
    }
    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:

    MixedAccount acc9 = new MixedAccount("456") { Code = 356 };
    Account acc10 = new MixedAccount("9867") { Code = 35678 };
    Console.WriteLine(acc9.Id);
    Console.WriteLine(acc10.Id);
    Shuni yodda tutish kerakki, agar asosiy sinf darajasida umumiy parametr uchun cheklov o'rnatilgan bo'lsa, u holda ushbu parametrdan foydalanadigan hosila sinflarda ham shunga o'xshash cheklash aniqlanishi kerak:

    class Account where T : class
    {
    public T Id { get; private set; }
    public Account(T _id)
    {
    Id = _id;
    }
    }
    class UniversalAccount : Account
    where T: class
    {
    public UniversalAccount(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 class ni cheklash yoki biron bir maxsus sinf sifatida ko'rsatish kerak.


    Download 70,5 Kb.
    1   ...   4   5   6   7   8   9   10   11   12




    Download 70,5 Kb.

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    1. System. Object sinfi va uning usullari Umumlashtirish

    Download 70,5 Kb.