Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Применение модификаторов доступа в аксессорах





В классе PropAccess аксессор set указан как private. Это означает, что он доступен только другим членам данного класса, например методу IncrProp(), но недоступен для кода за пределами класса PropAccess.

//применить модификатор доступа в асессоре

using System;

class PropAccess

{

int prop;//поле, управляемое свойством МуРrор

public PropAccess() { prop = 0; }

/* Это свойство обеспечивает доступ к закрытой переменной экземпляра prop.

Оно разрешает получать значение переменной prop из любого кода,

но устанавливать его — только членам своего класса. */

public int MyProp

{

get

{

return prop;

}

private set

{// теперь это закрытый аксессор

prop = value;

}

}

// Этот член класса инкрементирует значение свойства МуРrор.

public void IncrProp()

{

MyProp++; //Допускается в. том же самом классе.

}

}

// Продемонстрировать применение модификатора доступа в аксессоре свойства.

class PropAccessDemo

{

static void Main()

{

PropAccess ob = new PropAccess();

Console.WriteLine("Первоначальное значение ob.MyProp: " + ob.MyProp);

// ob.МуРrор = 100; // недоступно для установки

ob.IncrProp();

Console.WriteLine("Значение ob.MyProp после инкрементирования: " + ob.MyProp);

}

}

Вероятно, ограничение доступа к аксессорам оказывается наиболее важным для работы с автоматически реализуемыми свойствами. Как пояснялось выше, создать автоматически реализуемое свойство только для чтения или же только для записи нельзя, поскольку оба аксессора, get и set, должны быть указаны при объявлении такого свойства. Тем не менее добиться желаемого результата все же можно, объявив один из аксессоров автоматически реализуемого свойства как private. В качестве примера ниже приведено объявление автоматически реализуемого свойства Length для класса FailSoftArray, которое фактически становится доступным только для чтения.

public int Length { get; private set; }

Аналогичным образом можно объявить и свойство Error, как показано ниже.

public bool Error { get; private set; }

Благодаря этому свойство Error становится доступным для чтения, но не для установки за пределами класса FailSoftArray.

Для опробования автоматически реализуемых вариантов свойств Length и Error и в классе FailSoftArray удалим сначала переменные len и ErrFlag, поскольку они больше не нужны, а затем заменим каждое применение переменных len и ErrFlag свойствами Length и Error в классе FailSoftArray. Ниже приведен обновленный вариант класса FailSoftArray вместе с методом Main(), демонстрирующим его применение.

// Применить автоматически реализуемые и доступные

// только для чтения свойства Length и Error.

using System;

class FailSoftArray

{

int[] a; //ссылка на базовый массив

// Построить массив по заданному размеру.

public FailSoftArray(int size)

{

a = new int[size];

Length = size;

}

// Автоматически реализуемое и доступное только для чтения свойство Length.

public int Length { get; private set; }

// Автоматически реализуемое и доступное только для чтения свойство Error.

public bool Error { get; private set; }

// Это индексатор для массива FailSoftArray.

public int this[int index]

{

// Это аксессор get.

get

{

if (ok(index))

{

Error = false;

return a[index];

}

else

{

Error = true;

return 0;

}

}

// Это аксессор set.

set

{

if (ok(index))

{

a[index] = value;

Error = false;

}

else Error = true;

}

}

// Возвратить логическое значение true, если

// индекс находится в установленных границах.

private bool ok(int index)

{

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

return false;

}

}

// Продемонстрировать применение усовершенствованного

// отказоустойчивого массива.

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);

}

}

}

На применение модификаторов доступа в аксессорах накладываются следующие ограничения.

1. Во-первых, действию модификатора доступа подлежит только один аксессор: set или get, но не оба сразу.

2. Во-вторых, модификатор должен обеспечивать более ограниченный доступ к аксессору, чем доступ на уровне свойства или индексатора.

3. И наконец, модификатор доступа нельзя использовать при объявлении аксессора в интерфейсе или же при реализации аксессора, указываемого в интерфейсе. (Подробнее об интерфейсах речь пойдет в главе 12.)







Date: 2015-09-02; view: 387; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.008 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию