1-Mavzu 1-Mavzu Reja: Klass a’zolariga ruxsatni boshqarish


// FailSoftArray sinfiga Length xususiyatini qo'shish


Download 116.94 Kb.
bet68/100
Sana02.01.2022
Hajmi116.94 Kb.
#200801
1   ...   64   65   66   67   68   69   70   71   ...   100
Bog'liq
dasturiy injinering

// FailSoftArray sinfiga Length xususiyatini qo'shish.

using System;

class FailSoftArray {

int[] a; // asosiy massivga havola

int len; // Massiv uzunligi sifatida Length xususiyati asos bo'lib xizmat qiladi.

public bool ErrFlag; // oxirgi operatsiya natijasini belgilaydi

// Berilgan o`lchovda massiv qurish

public FailSoftArray(int size) {

a = new int[size];

len = size;

}

// Length xususiyati faqat o'qish uchun

public int Length {

get {

return len;

}

}

// FailSoftArray sinfi uchun indeksator.

public int this[int index] {

// get aksessori.

get {

if(ok(index)) {

ErrFlag = false;

return a[index];

} else {

ErrFlag = true;

return 0;

}

}

// set aksessori.

set {

if(ok(index)) {

a[index] = value;

ErrFlag = false;

}

else ErrFlag = true;

}

}

// Agar indeks belgilangan chegaralarda bo'lsa, mantiqiy true qiymatini qaytarish

private bool ok(int index) {

if(index >= 0 & index < Length) return true;

return false;

}

}

// Xatolardan xoli massivdan foydalanish.

class ImprovedFSDemo {

static void Main() {

FailSoftArray fs = new FailSoftArrayE);

int x;

// Length xususiyatiga o`qishga ruxsat berish

for(int i=0; i < fs.Length; i++)

fs[i] = i*10;

for(int i=0; i < fs.Length; i++) {

x = fs[i];

if(x != -1) Console.Write(x + " ");

}

Console.WriteLine() ;

// fs.Length = 10; // Xatolik, qiymat berish taqiqlangan!

}

}

Endi Length-bu saqlash joyi yopiq len o'zgaruvchisi bo'lgan xususiyatdir. Bu xususiyat get accessor tomonidan aniqlanganligi sababli, uni faqat o`qish mumkin. Bu Length xususiyatining qiymati faqat o'qilishi mumkin, ammo o'zgartirilmasligini anglatadi. Buni tekshirish uchun yuqoridagi kodni quyidagi satrning boshidagi sharh belgilarini olib tashlang.

// fs.Length = 10; // Xatolik, ro'yxatga olish taqiqlangan!

Agar siz ushbu kodni kompilyatsiya qilmoqchi bo'lsangiz, Length faqat o'qish uchun mavjud bo'lgan xususiyat ekanligini bildiradigan xatolik xabari olasiz. FailSoftArray sinfidagi Length xususiyatini qo'shish xususiyatlari yordamida kod namunasini takomillashtirishni ko`rib chiqish hali tugamadi. Sinfning yana bir xususiyatga aylantirilgan a'zosi ErrFlag o`zgaruvchisi faqat o`qish uchun xizmat qiladi. Quyida FailSoftArray sinfining Error xususiyati yaratish orqali ErrFlag asl yopiq o'zgaruvchisidan uning ma'lumotlarini saqlash uchun foydalanish maqsadida takomillashtirilgan versiyasi keltirilgan.

// ErrFlag o`zgaruvchisini xususiyatga aylantirish.

using System;

class FailSoftArray {

int[] a; // asosiy massivga havola

int len; // massiv uzunligi

bool ErrFlag; // bu oxirgi operatsiya natijasini

//ko'rsatuvchi xususiy o'zgaruvchi

// Berilgan o`lchamda massiv yaratish

public FailSoftArray(int size) {

a = new int[size];

len = size;

}

// Faqat o'qish uchun Length xususiyati

public int Length {

get {

return len;

}

}

// Faqat o'qish uchun Error xususiyati.

public bool Error {

get {

return ErrFlag;

}

}

// FailSoftArray sinf uchun indeksator.

public int this[int index] {

// get aksessori.

get {

if (ok(index) ) {

ErrFlag = falser;

return a[index];

} else {

ErrFlag = true;

return 0;

}

}

// set aksessori.

set {

if(ok(index)) {

a[index] = value;

ErrFlag = false;

}

else ErrFlag = true;

}

}

// Indeks belgilangan chegaralarda bo'lsa, mantiqiy true qiymatni qaytarish.

private bool ok(int index) {

if(index >= 0 & index < Length) return true;

return false;

}

}

// Xatoliklardan xoli massivdan foydalanish.

class FinalFSDemo {

static void Main() {

FailSoftArray fs = new FailSoftArray(5);

// Использовать свойство Error.

for(int i=0; i < fs.Length + 1; i++) {

fs[i] = i*10;

if(fs.Error)

Console.WriteLine("Ошибка в индексе " + i);

}

}

}

Error xususiyatini yaratish FailSoftArray sinfida quyidagi ikkita o'zgarishga sabab bo'ldi. Birinchidan, ErrFlag yopiq o'zgaruvchi bo`ldi, endi unga Error xususiyati uchun asosiy saqlash joyi bo`lgani uchun to'g'ridan-to'g'ri murojaat qilib bo`lmaydi. Ikkinchidan, "faqat o'qish uchun" Error xususiyati kiritildi. Endi Error xususiyati dasturda xatolarni aniqlashni tashkil qilishga javob beradi. U yuqoridagi Main() metodida ataylab massiv chegarasini buzilgandagi xatolarni ko`rsatar edi, endi Error xususiyati bu xatolarni aniqlash uchun ishlatiladi.

C# 3.0 versiyasidan boshlab, xususiyatlar boshqaradigan o'zgaruvchini aniqlamasdan, oddiy xususiyatlarni qo'llash imkoniyati paydo bo'ldi. Buning o'rniga, xususiyat uchun asosiy o`zgaruvchi avtomatik ravishda komplyator tomonidan beriladi. Ushbu xususiyat avtomatik ravishda amalga oshiriladi va quyidagi umumiy shaklni oladi:

tip nom { get; set; }

tip xususiyatning aniq tipini bildiradi, nom — xususiyatga tayinlangan nom. Shuni esda saqlash kerakkiget va set aksessorlarning belgilaridan keyin darhol nuqta-vergul qo`yiladi va ularning tanasi mavjud emas. Bunday sintaksis kompilyatorga avtomatik ravishda qiymat saqlashni qo'llab-quvvatlovchi maydon deb o`zgaruvchini yaratishni belgilanadi. Bunday o`zgaruvchiga to'g'ridan-to'g'ri murofaat mavjud emas va uning nom yo'q. Lekin ayni paytda undan xususiyat orqali foydalanish mumkin.

Quyida UserCount nomi ostida avtomatik ravishda amalga oshiriladigan xususiyatni e'lon qilish misoli keltirilgan.

public int UserCount { get; set; }

Ko'rib turganingizdek, ushbu kod satrida o`zgaruvchi aniq e'lon qilinmagan. Yuqorida aytib o'tilganidek, komplyator avtomatik ravishda anonim maydonini yaratadi va unda qiymat saqlanadi. Avtomatik ravishda amalga oshiriladigan boshqa barcha xususiyatlar UserCountga o'xshaydi.

Ammo an'anaviy xususiyatlardan farqli o'laroq, avtomatik ravishda amalga oshiriladigan xususiyatlar faqat o'qish yoki faqat yozish uchun foydalanilmaydi. Ushbu xususiyatni har qanday holatda e'lon qilganda ham get va set aksessorlari ko'rsatish kerak. Mumkin bo`lgan barchasi uchun yetarli bo`lsada (ya'ni, avtomatik ravishda amalga oshiriladigan xususiyatda faqat o'qish yoki faqat yozish yaratish) aksessorni private deb e`lon qilish mumkin (bu haqda ko'proq "Aksessorlarda ruxsat modifikatorlarini qo`llash" bo'limda).

Avtomatik ravishda amalga oshiriladigan xususiyatlarning qulayliklariga qaramasdan, ularni qo'llash, asosan, qo'llab-quvvatlovchi maydonlardan qiymatlarni olish yoki o`rnatishni boshqarish talab qilmaydigan holatlar bilan cheklanadi. Eslatib o'tamiz, qo'llab-quvvatlovchi maydon bevosita mavjud emas. Bu shuni anglatadiki, avtomatik ravishda amalga oshiriladigan xususiyat ega bo'lgan qiymatlar hech qanday cheklovlarsiz qo'llash mumkin emas. Natijada, dasturda ko`pincha avtomatik ravishda amalga oshiriladigan xususiyatlarning nomlari oddiygina maydonlarning nomlari bilan almashtirish talab qilinadi. Avtomatik ravishda amalga oshiriladigan xususiyatlar dasturning funktsional imkoniyatlari uchinchi tomon foydalanuvchilari uchun ochiqligi va buning uchun maxsus loyihalash vositalari qo'llanilishi mumkin bo`lgan hollarda foydali hisoblanadi.

 


Download 116.94 Kb.

Do'stlaringiz bilan baham:
1   ...   64   65   66   67   68   69   70   71   ...   100




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