Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual C++(.Net) / Visual C++(.Net).doc
Скачиваний:
167
Добавлен:
09.05.2015
Размер:
1.18 Mб
Скачать

Часть 2. Сборник рецептов по визуальному программированию Введение в объектно-ориентированное программирование

Концепция объектно-ориентированного программирования (ООП) включает в себя понятия объектов, классов, инкапсуляции и наследования.

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

Например, конкретная кошка, отдельно взятый компьютер, ручка и пр. – это все объекты.

Реальные объекты имеют две характеристики:

  • состояние, определяемое некоторым набором свойств;

  • поведение этого объекта.

Например, кошка имеет состояние, определяемое следующим набором свойств: кличка, масть, порода, характер и пр. А поведение животного определяется тем, что кошка в данный момент может мяукать, принимать пищу, спать и т.д. Поведение объекта определяется набором функций, заданных в объекте, которые называютсяметодами.

Класс – это некий чертеж, некий проект, из которого создается объект. В классе заложены свойства и поведение будущего объекта, который получается из класса как из проекта.

Например, «Автомобили» – это класс. «LADA» – это объект класса «Автомобили», конкретное воплощение класса в конкретную модель. Проект дома 121 серии – это класс, а сам конкретный дом, построенный по конкретному адресу – это объект класса домов 121 серии.

Таким образом, когда мы смотрим на окружающие нас объекты реального мира в плане их состояния и поведения, то готовы к пониманию объектно-ориентированного программирования.

Объектно-ориентированное программирование– это способ программирования с ориентацией на объекты. При таком способе создаются крупные программные образования – классы, куда закладываются общие свойства будущих объектов. Эти объекты станут получаться по определенным правилам из этих классов, куда записываются варианты поведения будущих объектов через создаваемые в классах параметрические программы (методы классов).

Такой способ значительно ускоряет разработку программного обеспечения и облегчает труд программиста.

Преимущества использования классов и объектов.

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

2. Механизм работы такого модуля скрыт внутри самого модуля и не отвлекает программиста на выяснение различных мелких деталей алгоритма.

3. Имеется возможность многократного использования элемента.

4. Обеспечивается легкая сменяемость элементов в общей программе (приложении): если такой элемент выходит из строя, его можно легко заменить аналогичным элементом, не разрушая всю задачу.

Классы

Мы не ставим своей целью разработку классов, но знать основные данные классов необходимо, т.к. иначе невозможно пользоваться ими при построении приложений в среде VC++.

Класс – это обыкновенный тип. Классы обычно более сложны, чем простые типы данных, но они работают тем же способом. Создавая переменные типа заданного класса, создаются экземпляры этого класса; назначая различные значения экземплярам того же типа, возможно выполнять разные задачи.

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

Класс – это дальнейшее развитие структур: в них тоже объявляются данные разных типов.

Если задан класс CAT, то объявляют переменнуюMurkaтипаCATпутем объявления

CAT Murka;

После этого можно работать с экземпляром класса, Murka. Как и при использовании структур, к членам класса (данным и методам) можно обращаться по тем же правилам:

  • если объявлено CAT Murka;то обращение к члену класса с именемcolorбудет записываться какMurka.color,

  • если объявлен указатель на класс (например, CAT *Murka;), то обращение к члену класса с именемcolorбудет записываться какMurka->color.

Класс – это конструкция, параметрически определяющая некоторую категорию объектов. Каждый класс может делиться на подклассы: автомобили «LADA» могут быть нескольких моделей – 2105, 2107,Kalina,Priora, Нива и т.д. Таким образом, классы могут принадлежать некой иерархии. В каждом классе определены характеристики тех объектов, которые образуют этот класс.

В состав класса входит специальный метод (т.е. программа-функция), который формирует экземпляр класса. Этот метод носит название конструктора. В противоположность конструктору, существует программа-деструктор, которая уничтожает экземпляр класса в памяти, освобождает память, которая впоследствии может использоваться для других программных целей.

Основными принципами построения классовявляются инкапсуляция, наследование и полиморфизм.

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

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

При добавлении новых характеристик классам программы, ранее использовавшие объекты, построенные из них, остаются без изменений.

В VisualC++ иBorlandC++Builderвведено понятиекомпонентов­– специальных классов, в которых объекты определяются такими характеристиками, как свойства, события и методы.

Причем, в отличие от работы с обычными классами, при работе в VC++ возможно манипулировать видом и функциональным поведением компонентов и на стадии проектирования приложения, и в момент его выполнения. Так, вVC++ существует компонент «форма» (классForm), компонент «кнопка» (классButton) и многие другие. У них есть свои свойства, методы и события.

Если при проектировании приложения в форму поместить две кнопки, то с помощью определения двух разных значений свойствам кнопок Text(название кнопки) иVisible(значенияfalseиtrueопределяют видимость кнопки при исполнении приложения), получим два экземпляра, которые ведут себя по-разному: первая кнопка будет невидима на форме, а вторая останется видимой.

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

Наследование– второй принцип построения классов. В общем случае классы могут составлять иерархию: один класс получается из другого, на основании другого получается третий и т.д. Т.е. речь идет о том, что и в классах существуют родители и дети, бабушки и дедушки, внуки и правнуки…

Наследование предполагает, что все характеристики класса-родителя присваиваются классу-потомку. После этого потомку при необходимости добавляют новые характеристики. Иногда некоторые методы в классе-потомке, полученном от предков, переопределяются, т.е. наполняются новым содержанием.

Наследование используется не только при разработке классов, но и при проектировании приложения. Например, в VC++ есть классLabel(метка). Если поместить экземпляр этой метки в форму (экземплярForm), то свойство «шрифт» метки примет значение свойства «шрифт» для экземпляраForm.

Меняя параметры шрифта у родителя, добиваемся изменения этих параметров у потомков (наследников). То есть, метка будет автоматически наследовать это свойство от экземпляра Form, на который она помещена. Это же относится и к другим классам.

Полиморфизм– это третий принцип, лежащий в основе создания класса. При полиморфизме родственные объекты (т.е. происходящие от общего родителя) могут вести себя по-разному в зависимости от ситуации, возникающей в момент выполнения программы. Чтобы добиться полиморфизма, надо иметь возможность один и тот же метод в классе-родителе переопределить и в классе-потомке.

Например, все классы имеют общего прародителя – класс Object. В этом классе определен методdraw. Классы, рисующие различные фигуры и произошедшие отObject– родственные классы. Каждый из них определяет рисование своей фигуры методомdraw, унаследованным отObject: точку, линию, прямоугольник, окружность и пр. Все фигуры разные, хотя метод общий. Но этот методdrawв каждом из классов-потомков переопределен, т.е. в каждом классе-потомке ему назначена другая функциональность.

Полиморфизм достигается за счет того, что методам из класса-родителя позволено выполняться в классе-потомке, а там определяют только его имя, но при этом дают ему необходимую для данного класса функциональность. Такие методы объявляются в обоих классах с атрибутом virtual, записываемом перед атрибутом «возвращаемый тип данных». Если функция имеет такой атрибут, то она может быть переопределена в классе-потомке, даже если количество и тип ее аргументов такое же, что и у функции базового класса. Переопределенная функция отменяет функцию базового класса.

Кроме атрибута virtual, у методов существует атрибутfriend. Методы с таким атрибутом называютсядружественными. Метод, объявленный с таким атрибутом, имеет полный доступ к защищенным членам класса, даже если этот метод не является членом этого класса. Это справедливо и для классов: внешний класс (т.е. его методы) имеет полный доступ к классу, который объявляет этот внешний класс дружественным.

Во всех остальных аспектах дружественный метод – это обычный метод.

Рассмотрим структуру базового класса .

class <имя>{

private:/* Данные и методы, помещенные в эту секцию, будут доступны только методам этого класса. Доступ к ним методам производных классов запрещен */

<Приватные данные>

<Приватные конструкторы>

<Приватные методы>

protected:/* Данные и методы, помещенные в эту секцию, будут доступны методам этого класса и производным от него, т.е. его потомкам */

<Защищенные данные>

<Защищенные конструкторы>

<Защищенные методы>

public:/* Данные и методы, помещенные в эту секцию, будут доступны методам всех классов */

<Общедоступные данные>

<Общедоступные конструкторы>

<Общедоступный деструктор>

<Общедоступные методы>

};

Заметим, что и для структур в С++ можно задавать секции public,privateиprotected. Эти атрибуты называются атрибутами доступа к членам класса.

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

Конструктор выполняет различные задачи и не виден программисту. Даже если программист сам не писал текст этой функции, конструктор по умолчанию всегда присутствует в классе, т.к. его основная задача – создавать в памяти экземпляр класса. В этом случае конструктор берется из общего прародителя классов – класса Object, в котором он имеется.

Еще одна задача конструктора – присваивать всем данным класса начальные значения. Если не построено инициализирующего конструктора, то данным конструктор по умолчанию присвоит свои значения, принятые в системе для данного типа величин (например, целочисленные данные получат нулевые значения).

Суть функции-деструктора класса– обратная сути функции конструктора. Она призвана разрушить созданный конструктором экземпляр класса и освободить от него память. Имя деструктора совпадает с именем класса, но перед именем указывается знак «тильда» (~). Деструктор у класса должен быть один.