1. System. Object sinfi va uning usullari Umumlashtirish Umumlashganlarning cheklovlari
Download 48.75 Kb.
|
11 System Object asosiy tayanch sinfidan hosilaviy sinflarni yaratish
- Bu sahifa navigatsiya:
- 4. Umumiy turdagi meros
- 2`. System.Object ning bazaviy turi.
Usul cheklovlari. Usul cheklovlari xuddi shunday tarzda ishlatilishi mumkin:
private static void Main(string[] args) { Account Account Transact Console.Read(); } public static void Transact { if (acc1.Sum > sum) { acc1.Sum -= sum; acc2.Sum += sum; } Console.WriteLine($"acc1: {acc1.Sum} acc2: {acc2.Sum}"); } Transact usuli cheklash sifatida Account 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 { public UniversalAccount(T id) : base(id) { } } Sinfga murojaat qilish: Account Account UniversalAccount 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 // siz bunday yozolmaysiz //Account 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 { 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 Account 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 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 Account 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 { public T Id { get; private set; } public Account(T _id) { Id = _id; } } class UniversalAccount 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. 2`. System.Object ning bazaviy turi. C# tilidagi barcha turlar, ham strukturaviy, ham mos yozuvlar turlari bitta umumiy ajdoddan, System.Object sinfidan olingan. Bu standart bo'lib, olingan turni e'lon qilishda ushbu asosiy sinfni aniq ko'rsatishga hojat yo'q. Garchi buni aniq ko'rsatishga hech narsa to'sqinlik qilmasa ham. Quyida tegishli turdagi deklaratsiyalari bir xil bo'lgan kod parchasining variantlari keltirilgan. class Hello // System.Object ajdodi standart bo'yicha qabul qilinadi { .................... } struct HELLO // System.Object ajdodi standart bo'yicha qabul qilinadi { .................... } Listing 11.12 . System.Object ajdodini aniq ko'rsatmasdan deklaratsiyalarni kiriting. class Hello : System.Object { .................... } struct HELLO : System.Object { .................... } Listing 11.13 . System.Object ajdodini aniq ko'rsatmasdan deklaratsiyalarni kiriting. using System; namespace Test { class Hello : Object // Qisqartirilgan, chunki nom maydoni aniqlangan { .................... } struct HELLO : object // Kichik harf bilan, chunki sinonim berilgan { .................... } } Listing 11.14. System.Object ajdodining aniq kesilgan ko'rsatkichi bilan deklaratsiyalarni yozing. Quyida System.Object kutubxona sinfini e'lon qilish uchun kod keltirilgan namespace System { public class Object { public Object(); public virtual Boolean Equals(Object obj); public virtual Int32 GetHashCode(); public Type GetType(); public virtual String ToString(); protected virtual void Finalize(); protected Object MemberwiseClone(); } } Listing 11.15. Quyida System.Object kutubxona sinfini e'lon qilish uchun kod keltirilgan Har bir usulning maqsadi jadvalda ko'rsatilgan. 11.1-jadval. System.Object bazaviy kutubxona sinfining asosiy usullari
Download 48.75 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling