- •Предисловие
- •1 Среда визуального программирования visual studio.Net
- •1.1 Введение в объектно - ориентированное программирование
- •1.2 Понятие о событийном управлении Windows
- •1.3 Основные окна среды Visual Studio.Net
- •1.4 Основные структурные элементы разработки проекта c#
- •1.5 Пример первой учебной программы
- •2.1 Технология визуального проектирования форм
- •1.6 Вопросы для самопроверки
- •2 Элементы управления
- •2.2 Элементы управления панели Toolbox
- •2.3 Пример использования элементов управления
- •2.4 Вопросы для самопроверки
- •3 Графический интерфейс языка c#
- •3.1 Пространство имен System.Drawing
- •3.2 Класс Graphics
- •3.3 Пример программной реализации
- •3.4 Вопросы для самопроверки
- •4 Использование меню в приложении
- •4.1 Меню программы
- •4.2 Создание инструментальной панели приложения
- •4.3.Вопросы для самопроверки
- •5 Использование диалоговых меню
- •5.1 Обработчики событий для работы с матрицей
- •5.2 Обработчик событий для открытия файла
- •5.3 Обработчик событий для записи в файл
- •5.4 Обработчик событий для работы с текстом
- •5.5 Вопросы для самопроверки
- •6 Многооконные приложения
- •6.1 Создание «кнопочной» главной формы
- •6.2 Добавление новых форм приложения
- •6.3 Обработчики событий главной формы
- •6.4 Табличная форма представления и редактирования значений
- •6.5 Графическая форма представления прямоугольников
- •6.6 Вопросы для самопроверки
- •7. Понятие класса
- •7.1 Понятие класса
- •7.2 Состав класса
- •7.3 Методы класса
- •7.4 Структура объекта
- •7.5 Пример учебной программы
- •7.6 Доступ к полям
- •7.7 Вопросы для самопроверки
- •1 Понятие класса?
- •8 Элементы классов
- •8.1 Конструкторы
- •8.2 Деструкторы
- •8.3 Свойства
- •8.4 Параметр по ссылке this
- •8.5 События класса
- •8.6 Перегрузка операций класса
- •8.7 Вопросы для самопроверки
- •9 Принципы ооп
- •9.1 Понятие инкапсуляции
- •9.2 Понятие наследования
- •9.3 Вопросы для самопроверки
- •10 Принцип полиморфизма
- •10.1 Понятие полиморфизма
- •10.2 Пример статического наследования методов
- •10.3 Пример динамического наследования методов
- •10.4 Вопросы для самопроверки
- •11 Использование интерфейсов
- •11.1 Понятие интерфейса
- •11.2 Синтаксис интерфейса
- •11.3 Использование стандартного интерфейса iEnumerable
- •11.4 Вопросы для самопроверки
- •12 Композиция и коллекция классов
- •12.1 Понятие композиции и коллекции класса
- •12.2 Пример использования композиции и коллекции класса
- •12.3 Некоторые коллекции Framework
- •12.4 Коллекция ArrayList
- •12.5 Вопросы для самопроверки
- •13 Делегаты
- •13.1 Понятие делегата
- •13.2 Описание делегата
- •13.3 Пример использования делегата
- •13.4 Совместимость делегатов
- •13.5 Методы базовых классов делегатов
- •13.6 Вопросы для самопроверки
- •14 События
- •14.1 Понятие события
- •14.2 Некоторые часто используемые события среды Visual Studio.Net
- •14.3 Пример использования стандартных событий классов
- •14.4 Нестандартные события классов
- •14.5 Вопросы для самопроверки
- •Приложение а Ответы на вопросы для самопроверки
- •1 Понятие класса?
- •Предметный указатель
- •Список литературы
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) { . . . }
. . .
};
При инициализации объекта возможен любой из предложенных вариантов.
