Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_С#_ч_2.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

7.6 Доступ к полям

Каждое поле имеет модификатор доступа, принимающий одно из четырех значений: public, private, protected, internal. Возможно совместное задание двух атрибутов protected и internal.

Модификатор private. Модификатор private является атрибутом доступа по умолчанию. Он закрывает поля от всех других классов, разрешая прямой доступ к ним (чтение и запись) только методам самого класса. Помните, все поля всегда доступны всем методам класса. Они являются для методов класса глобальной информацией, с которой работают все методы, извлекая из полей нужные им данные и изменяя их значения в ходе работы.

Модификатор protected. Этот модификатор открывает поля классам наследникам. Если класс A объявил некоторое поле с модификатором protected, то методы класса B, который является наследником класса A и, следовательно, наследует поля класса A, могут непосредственно работать с наследуемыми полями.

Модификатор internal. Этот модификатор открывает поля дружественным классам. Два класса A и B называются дружественными, если они принадлежат одной сборке - одному проекту. Если класс A объявил некоторое поле с модификатором internal, то методы дружественного класса B, являющегося клиентом класса A, могут непосредственно работать с таким полем.

Комбинация атрибутов protected и internal. Эта комбинация открывает поле тем классам, которые являются либо наследниками, либо дружественными классами. Если требуется более строгое ограничение доступа к полю, чтобы оно было доступно только тем наследникам, которые являются дружественными классами, то сам класс нужно объявить с модификатором internal, а соответствующее поле - с модификатором protected.

Если поля доступны только для методов класса, то они имеют модификатор доступа private, который можно опускать. Такие поля считаются закрытыми, но часто желательно, чтобы некоторые из них были доступны в более широком контексте. Если некоторые поля класса A должны быть доступны для методов класса B, являющегося потомком класса A, то эти поля следует снабдить модификатором protected. Такие поля называются защищенными. Если некоторые поля должны быть доступны для методов классов B1, B2, и так далее, дружественных по отношению к классу A, то эти поля следует снабдить модификатором internal, а все дружественные классы B поместить в один проект (assembly). Такие поля называются дружественными. Наконец, если некоторые поля должны быть доступны для методов любого класса B, которому доступен сам класс A, то эти поля следует снабдить модификатором public. Такие поля называются общедоступными или открытыми.

7.7 Вопросы для самопроверки

1 Понятие класса?

2 Понятие свойства класса?

3 Понятие конструктора класса?

4 Понятие деструктора класса?

5 Понятие события класса?

6 Понятие индексатора класса?

7 Назначение поля this объекта?

8 Как называют переменную типа класс?

9 Что означает служебное слово static в описании класса?

10 Что означает служебное слово public в описании данных класса?

8 Элементы классов

8.1 Конструкторы

Основное назначение конструктора – создать объект и элементам данных этого объекта присвоить некоторые начальные значения. Иногда этот процесс называют инициализацией объекта.

Создание объекта является основной задачей конструктора.

Присваивание элементам данных объекта некоторых значений может осуществляться различными способами.

В зависимости от способа определения значений элементов данных объекта различают:

– конструкторы с умолчанием;

– конструкторы с заданием параметров;

– множественные конструкторы.

Конструктор с умолчанием вызывается в программе, без каких либо параметров. Например,

treyg t1 = new treyg();

Это означает, что элементам данных объекта t1 присваиваются некоторые фиксированные значения – обычно нулевые.

Реализация такого конструктора может включать операторы присваивания полям данным класс некоторых фиксированных значений.

Например, в наш класс можно добавить конструктор с умолчанием, который присваивает (по умолчанию) сторонам треугольника фиксированные значения 3, 4 и 5. В этом можно убедиться, если добавить метод печати периметра объекта:

public treyg()

{

a = 3; b = 4; c = 5;

}

public void printO()

{

p = a + b + c;

ss = "Периметр треугольника = " + p.ToString();

}

Рисунок 8.1 – Использование в программе конструктора с фиксированными начальными значениями

Конструкторы с заданием параметров позволяют определять начальные значения элементов данных объекта во время создания объекта. Объявление таких конструкторов в классе выглядит следующим образом:

public treyg(int sa, int sb, int sc)

{

a = sa; b = sb; c = sc;

}

Многие программисты включают в реализацию конструктора проверку на допустимые значения элементов данных объектов, создавая так называемые «умные» конструкторы. Например, в реализацию конструктора класса треугольник, можно включить следующие проверки элементов данных:

– все стороны треугольника данных должны быть больше 0;

– сумма любых двух сторон треугольника должна быть больше третьей стороны.

Если условия не выполняются необходимо выдать сообщение и присвоить элементам данных объекта некоторые фиксированные значения или повторить ввод.

Объявление такого «умного» конструктора ни чем не отличается от объявления обычного конструктора, а реализация включает все необходимые проверки в функции ввода данных класса, например:

public treyg(int sa, int sb, int sc)

{

vvod(sa,sb,sc);

}

Изменим код программы нашего обработчика события следующим образом – умышленно введем в конструкторе неправильные значения сторон треугольника:

private void button1_Click(object sender, EventArgs e)

{

int A, B, C;

treyg t = new treyg(3,5,9);

t.printO();

A = Convert.ToInt32(textBox1.Text);

B = Convert.ToInt32(textBox2.Text);

C = Convert.ToInt32(textBox3.Text);

t.vvod(A,B,C);

textBox4.Text = t.ss;

}

Работа программы на рисунке 8.2

Рисунок 8.2 – Работа программы с заведомо неправильными значениями в конструкторе

Множественные конструкторы используют перегрузку функций при обработке аргументов разного типа.

Такие конструкторы используются, когда значения данных могут задаваться в различных формах, например, целым или вещественным числами или строкой.

Обычно такие конструкторы применяются для обработки дат.

Используя перегрузку функций можно в описание класса включать несколько конструкторов, «понимающих» данные различного типа.

Например, текущую дату можно задавать по умолчанию или вводить разными способами. Возможны, например, следующие три варианта значений ввода даты:

целыми числами (месяц, день и год – 23 12 07);

некоторым текстом (23 декабря 2007 года);

набором с использованием дополнительных символов (20.10.07 или 17/09/2007).

class date

{

. . .

date() { . . . }

date(int mm, int dd, int gg) { . . . }

date (string tekct) { . . . }

. . .

};

При инициализации объекта возможен любой из предложенных вариантов.