1. System. Object sinfi va uning usullari Umumlashtirish Umumlashganlarning cheklovlari


Download 48.75 Kb.
bet9/11
Sana19.06.2023
Hajmi48.75 Kb.
#1600338
1   2   3   4   5   6   7   8   9   10   11
Bog'liq
11 System Object asosiy tayanch sinfidan hosilaviy sinflarni yaratish

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.


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:
1   2   3   4   5   6   7   8   9   10   11




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling