Тема 5
Основы объектно-ориентированного программирования (ООП )
Лекция 5.1.
Базовые понятия ООП .
Литература
Основная:
Павловская Т.А., Щупако Ю.А. C / C ++. Структурное программирование, Питер, 2005. – 402 с.
Дополнительная:
Гросс К. С# 2008: Пер. с. анг. – СПб. БХВ-Петербург, 2009. – 576 с.
Троелсен Э. Язык программирования С# 2005 и платформа /NET 2.0:пер. с анг. – М:. ООО «И.Д. Вильямс, 2007. – 1168 с.
Вопросы :
1. Классы и объекты. 2. Принципы ООП. 3. Пространство имен. 4. Описание класса .
1. Классы и объекты.
В ООП основной акцент делается на структуру и взаимодействие данных и процедур их обработки.
Объект является своего рода "строительным блоком" в приложении. Этот блок инкапсулирует часть приложения - функцию, порцию данных. Объект похож на тип структуры.
Переменные представляют в объекте хранимые данные, функции – обеспечивают доступ к возможностям этого объекта. Объекты могут не обслуживать никаких данных, а содержать только функции. Например, объект, представляющий принтер, предоставляет функции распечатки документа или тестовой страницы и т.п.
И наоборот, объект может содержать только данные.
Тип объекта в ООП называется классом . Класс представляет собой пользовательский тип данных (шаблон), он объединяет разнотипные данные и функции, логически организованные в единое целое.
Классы используют для создания объектов , под которыми понимаются реальные именованные экземпляры класса . Понятия " экземпляр класса " и " объект " эквиваленты, а термины " класс " и " объект " обозначают разные вещи.
На основе одного класса можно создавать любое количество объектов. Например, классом можно считать марку автомобиля, а объектом – конкретный автомобиль, поскольку он является реализацией марки (ее экземпляром).
Класс обеспечивает некоторую функциональность, например, предоставляет средства создания элемента интерфейса (окна Windows , меню и т.п.) или прикладной обработки.
Жизненный цикл объекта
Этап конструирования . При создании экземпляра класса (объекта) он должен инициализироваться. Инициализация называется конструированием, и выполняется функцией-конструктором . Конструктор обеспечивает вычисление количества байтов, необходимых для размещения объекта, и выделение памяти в динамической области.
Этап использования.
Этап деструкции . При уничтожении объекта выполняются операции по очистке, освобождению памяти. За их выполнение отвечает функция-деструктор .
К основным понятиям ООП относят:
принципы ООП – инкапсуляция, наследование, полиморфизм;
компоненты класса – поля, свойства, методы, интерфейсы, конструкторы и деструкторы;
отношения между объектами ;
перегрузку операции ;
события .
Организация объекта
Установка при проектировании
Интер-фейс
Поля
Свойства
Обращения к компонентам объекта
Методы
Обработчики событий
События
2. Принципы ООП
Инкапсуляция - объединение данных и обрабатывающих их методов внутри класса или объекта. Класс содержит описание:
- полей ,
- свойств,
- методов и, возможно, интерфейсов .
Инкапсуляция позволяет скрыть детали реализации объекта от пользователей. Это обеспечивает защиту данных от несанкционированного или неправильного использования.
Значения свойств и полей характеризуют состояние конкретного объекта . В свойствах и полях разных объектов одного класса могут храниться разные значения. Пусть имеется класс UchDiszip , представляющий учебную дисциплину. При создании экземпляра этого класса (объекта) надо обеспечить конкретное состояние, чтобы он имел какой-то смысл. Тогда каждый конкретный объект типа UchDiszip будет иметь определенное состояние, например: " Алгоритмические языки и программирование, количество учебных часов 160, экзамен ". После этого свойства и поля предоставляют пользователю данного объекта возможность определить наименование дисциплины, отчетность и т.д.
Значения полей устанавливаются путем ввода, данные в них сохраняется в виде значений string , int и т.д. Объекты могут ограждать пользователей от деталей своих данных. Свойства отличаются от полей тем, что они не предоставляют непосредственного доступа к данным. Так, для сохранения информации о количестве часов в поле типа int экземпляра UchDiszip пользователи помещают в него желаемые значения и подвергаются лишь тем ограничениям, которые имеются у выбранного типа данных. Например, в случае использования поля типа int пользователи смогут помещать в него любое значение в диапазоне от -2 147 483 648 до 2 147 483 647. Очевидно, не все значения имеют смысл, особенно отрицательные, а большие положительные значения потребуют обучения в течение чрезмерно большого количества лет. В случае применения свойства для сохранения информации значение можно ограничить числами, скажем, от 50 до 200.
Для доступа к состоянию лучше предоставлять свойства , а не поля, поскольку они позволяют управлять большим количеством аспектов. Этот выбор не влияет на код, применяющий экземпляры объектов, потому что синтаксис для использования свойств и полей выглядит одинаково.
Методы – обеспечивают доступ к функциональным возможностям объекта, т.е. характеризует функциональность объекта. У одного объекта может быть много методов. Методы реализуются в виде функций. Они используют в своих операциях поля и свойства объекта.
Объекты могут генерировать и потреблять события ( event ). События обычно являются инициатором выполнения определенных действий. С их помощью создают приложения, управляемые событиями. Так, все приложения для Windows полностью зависят от событий. Каждое действие пользователя (нажатие клавиши, щелчок мыши и т.д.) инициирует событие, которое обрабатываются программно.
Наследование – это порождение нового производного класса- потомка от родительского ( базового ) класса . Потомок наследует от предка все его поля, свойства, методы и события. Наследуемые компоненты можно использовать в неизменном виде или переопределять (модифицировать).
Просто наследование обычно смысла не имеет, поэтому в производный класс добавляются новые элементы, определяющие его особенность и функциональность.
Предок у класса всегда один .
От нового класса можно породить следующий класс, в результате образуется дерево классов ( иерархия классов ). В корне дерева находится класс Object , который реализует наиболее общие возможности, например, действия по созданию и удалению объекта. Чем дальше конкретный класс отстоит в дереве от класса Object , тем большей специфичностью он обладает.
Полиморфизм – характеризует способность языка одинаково интерпретировать родственные объекты. Методы могут иметь одинаковые имена, но различное содержание. Это достигается переопределением метода - предка в классе потомке. В результате предок и потомок ведут себя по-разному. При этом обращение к одноименным методам различных объектов выполняется аналогично.
Несколько методов могут иметь одинаковые имена, но различаться составом или типом формальных параметров.
3. Пространство имен
. Код программы записывается в фигурных скобках. Внутри этого пространства обращение к имени осуществляется обычным образом. Вне этого пространства для обращения к «внутреннему» имени оно должно квалифицироваться . Квалифицированное имя содержит наименование пространства имен и через точку имя объекта. Пространства имен можно вкладывать друг в друга. " width="640"
Код программы содержится в так называемом глобальном пространстве имен . Доступ к именам этого пространства имеют все объекты, находящиеся в этом же пространстве.
Программист может создавать свои пространства имен, используя ключевое слово namespace имя пространства . Код программы записывается в фигурных скобках. Внутри этого пространства обращение к имени осуществляется обычным образом. Вне этого пространства для обращения к «внутреннему» имени оно должно квалифицироваться . Квалифицированное имя содержит наименование пространства имен и через точку имя объекта. Пространства имен можно вкладывать друг в друга.
Примеры:
а)
namespace lev //объявлено пространство имен lev
{
int var 1; //объявлена переменная var 1 в //пространстве имен lev
… //фрагмент программы для пространства имен lev
var 1= var 1+1;
}
//Для обращения к переменной var 1 вне этого пространства
//указывают квалифицированное имя
lev . var 1=0;
б) вложенные пространства имен
namespace lev 1 //объявлено пространство имен lev 1
{
int var 1; //объявлена переменная var 1 в пространстве имен lev 1
… //фрагмент программы пространства имен lev 1
var 1= var 1+1; //обращение к переменной из пространства имен lev 1
namespace lev 2 //объявлено пространство имен lev 2
{
int var1, var2;
…
var2=var1*3;
}
lev2.var1=1; //обращение к переменной из пространства имен lev2
}
…
lev1.lev2.var1=7;
Для упрощения обращения к переменным можно использовать оператор using , например, используя оператор using lev 2; можно в пространстве имен lev 1 обращаться к переменной var 2 . Но для исключения неоднозначности с переменной var 1 для пространства имен lev 1 и выше необходимо указывать квалификационное имя.
В начале текста программы операторы
using System;
using System.Collections.Generic;
using System.Text;
подключают стандартные пространства имен базовых средств, необходимых для работы программы, например Console, Convert .
4. Описание класса
Для характеристики уровней доступности классов, объектов, полей, свойств используют понятие тип доступа и доступность:
- тип доступа поля или свойства . Характеризует возможность чтения или записи. Некоторые поля и свойства доступны только для чтения, т.е. позволяют осуществлять просмотр значений, но не вносить изменения, по крайней мере напрямую. Другие поля и свойства доступны только для записи и не позволяют просматривать содержимое свойства. Третий вид полей и свойств доступен для чтения и для записи;
- доступность . Задает права доступа. Доступность определяет какой код может получить доступ к данным свойствам.
Виды доступности:
- общая ( public ). Свойства доступны для всего кода программ;
- закрытая ( private ). Свойства доступны только для кода внутри класса и недоступны в объектах – потомках и в коде программы вне класса. Используется по умолчанию, если не указан конкретный вид;
- защищенная ( protected ). Свойства доступны для кода внутри класса и его потомков. Вне класса и его потомков свойства недоступны;
- внутренняя ( internal ). Свойства доступны для кода проекта, внутри которого они определены.
Методы и поля имеют такие же виды доступности.
5 || value else { sum += value ; KolOz++; } } } //конец описания свойства SrBall } //конец описания класса ClassKursant " width="640"
namespace т05.01 //Пример описания класса
{
class Program
{
class ClassKursant //класс для подсчета среднего балла
{
public string Name; //фамилия курсанта
private float sum = 0.0f; //сумма оценок
private int KolOz = 0; //количество оценок
public float SrBall //средний балл
{
get
{
return sum / KolOz;
}
set
{
if ( value 5 || value else { sum += value ; KolOz++; }
}
} //конец описания свойства SrBall
} //конец описания класса ClassKursant
static void Main( string [ ] args)
{
ClassKursant kursant = new ClassKursant ();
kursant.Name = "Сидоров";
for (i = 0; i
Console.WriteLine("Курсант {0}", kursant.Name);
Console .WriteLine("Средняя величина={0} srball={1}", Math .Sqrt(kursant.SrBall), kursant.SrBall);
… .
Вопросы для самоподготовки
- Понятие и состав класса.
- Соотношение понятий класса и объекта.
- Понятия наследования, инкапсуляции, полиморфизма.
- Изучить постановку задачи на практическое занятие.
- Разработ ка простой объектно-ориентированной программы
- Разработать программу, содержащую описание простого класса, предназначенного для хранения и обработки результатов измерений хi , i =1, 2, …, n . Класс должен принимать положительные значения измерений, накапливать их сумму и количество. По обращению к заданному разработчиком свойству класс должен выдавать среднее значение измерений.
- Программа должна обеспечивать:
- 1. Создание экземпляра класса (объекта);
- 2. Вывод подсказки по взаимодействию программы с пользователем.
- 3. Ввод положительных значений результатов измерений;
- 4. Обращение к объекту для накопления измерений;
- 5. Пункты 3 и 4 повторяются до тех пор, пока пользователь не введет нулевое значение измерений;
- 6. Обращение к объекту для получения среднего значения результатов измерений и отображение результата усреднения.


Базовые понятия ООП (223.5 KB)

