Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОГРАММНАЯ ИНЖЕНЕРИЯ.docx
Скачиваний:
115
Добавлен:
09.09.2018
Размер:
2.83 Mб
Скачать

1.4 Составляющие класса и объекта

Классами в системе программирования Delphi называются специальные типы,

которые содержат составляющие класса: поля, методы и свойства. Составляющие класса

часто называют членами класса. Класс предназначен для создания конкретных экземпляров реализации, которые называются объектами.

Поле класса - в объектно-ориентированном программировании — переменная, связанная с классом или объектом. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по их имени. Обычно тип данных каждого поля задаётся в описании класса, членом которого является поле. Поля могут быть любого типа, в том числе – классами.

Поля класса синтаксически являются обычными переменными (объектами) языка. Их описание удовлетворяет обычным правилам объявления переменных. Содержательно поля задают представление той самой абстракции данных, которую реализует класс. Поля характеризуют свойства объектов класса. Напомню, что когда создается новый объект класса (в динамической памяти или в стеке), то этот объект представляет собой набор полей класса. Два объекта одного класса имеют один и тот же набор полей, но разнятся значениями, хранимыми в этих полях. Все объекты классаPersonмогут иметь поле, характеризующее рост персоны, но один объект может быть высокого роста, другой – низкого, а третий – среднего роста. Поля содержат данные объекта

Методы – определяют действия, которые объект способен выполнять. Метод — это фрагмент кода, к кот можно обратиться по имени. Он описывается один раз, а вызываться может столько раз, сколько необходимо.

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

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

Запись метода: доступ тип_возврата имя (список_параметров) {// тело метода}

Доступ к методам

Каждый метод имеет модификатор доступа, принимающий одно из четырех значений:public,private,protected. Атрибутом доступа по умолчанию является атрибут private. Независимо от значения атрибута доступа все методы доступны для вызова при выполнении метода класса. Если методы имеют атрибут доступа private, возможно опущенный, то тогда они доступны только для вызова только внутри методов самого класса. Такие методы считаются закрытыми. Понятно, что класс, у которого все методы закрыты, абсурден, поскольку никто не смог бы вызвать ни один из его методов. Как правило, у класса есть открытые методы, задающие интерфейс класса, и закрытые методы. Интерфейс – это лицо класса, именно он определяет, чем класс интересен своим клиентам, что он может делать, какие сервисы предоставляет клиентам. Закрытые методы составляют важную часть класса, позволяя клиентам класса не вникать во многие детали реализации класса. Эти методы клиентам класса недоступны, они о них могут ничего не знать, и, самое главное, изменения в закрытых методах класса никак не отражаются на клиентах класса при условии корректной работы открытых методов класса.

Для получения и передачи данных в классе применяются свойства. Для объявления свойств в классе используется зарезервированное слово property.

Свойства представляют собой атрибуты, которые составляют индивидуальность объекта и помогают описать его. Например, обычная кнопка в окне приложения обладает такими свойствами, как цвет, размеры, положение. Для экземпляра класса "кнопка" значения этих атрибутов задаются при помощи свойств — специальных переменных, определяемых ключевым словом property. Цвет может задаваться свойством Color, размеры — свойствами Width и Height и т. д.

Так как свойство обеспечивает обмен данными с внешней средой, то для доступа к его значению используются специальные методы класса. Поэтому обычно свойство определяется тремя элементами: полем и двумя методами, которые осуществляют его чтение/запись.

(Состояние объекта характеризуется перечнем всех свойств объекта и текущими значениями каждого из этих свойств

Поведение объектов, как уже говорилось выше, характеризуется

определенным набором реакций на получаемые сообщения и часто зависит от

состояния объекта. Результат выполнения действий зависит от состояния объекта на момент совершения действия, т.е. нельзя, например, удалить файл, если он открыт кем-либо (заблокирован). В то же время действия могут менять внутреннее состояние объекта - при открытии или закрытии файла свойство «открыт» принимает значения «да» или «нет», соответственно.

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

Объекты, обладающие сходными состояниями и поведением с точки

зрения решаемой задачи, образуют группу (например, объекты Колонки).

Свойства объекта, которые отличают его от всех других объектов группы,

составляют его индивидуальность. Так каждая колонка может иметь

собственную пропускную способность.

Если объект может обладать некоторым состоянием, то, соответственно,

может возникнуть необходимость в получении информации об этом состоянии.

Для получения такой информации объекту посылается сообщение-запрос. В ответ на запрос объект должен переслать отправителю требуемую

информацию. В таких случаях говорят, что над объектом выполнена операция

селекции. Обращение к объекту для изменения его состояния по всем или

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

Отправитель сообщения-команды, реакцией на которую должна быть

модификация объекта, может ожидать завершения операции, а может

продолжить выполнение своей программы. Второй вариант обработки

называется асинхронным, и его реализация требует использования (или

моделирования) параллельной обработки.

Если объект содержит несколько однотипных компонент, например,

массив чисел, то операция, требующая последовательной обработки этих

компонент, называется итерацией. Поэлементно могут выполняться как

операции селекции, так и операции модификации.

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

следующим образом (рис. 1.14):

создание объекта;

уничтожение объекта;

модификация - изменение состояния объекта;

селекция - доступ для определения состояния;

итерация - доступ к содержимому объекта по частям в определенной

последовательности (используется при наличии в объекте некоторых)

1.6 Элементы класса: поля, методы и свойства.

Классами в системе программирования Delphi называются специальные типы,

которые содержат составляющие класса: поля, методы и свойства. Составляющие класса

часто называют членами класса. Класс предназначен для создания конкретных экземпляров реализации, которые называются объектами.

Поле класса - в объектно-ориентированном программировании — переменная, связанная с классом или объектом. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по их имени. Обычно тип данных каждого поля задаётся в описании класса, членом которого является поле. Поля могут быть любого типа, в том числе – классами.

Поля класса синтаксически являются обычными переменными (объектами) языка. Их описание удовлетворяет обычным правилам объявления переменных. Содержательно поля задают представление той самой абстракции данных, которую реализует класс. Поля характеризуют свойства объектов класса. Напомню, что когда создается новый объект класса (в динамической памяти или в стеке), то этот объект представляет собой набор полей класса. Два объекта одного класса имеют один и тот же набор полей, но разнятся значениями, хранимыми в этих полях. Все объекты классаPersonмогут иметь поле, характеризующее рост персоны, но один объект может быть высокого роста, другой – низкого, а третий – среднего роста. Поля содержат данные объекта

Методы – определяют действия, которые объект способен выполнять. Метод — это фрагмент кода, к кот можно обратиться по имени. Он описывается один раз, а вызываться может столько раз, сколько необходимо.

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

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

Запись метода: доступ тип_возврата имя (список_параметров) {// тело метода}

Доступ к методам

Каждый метод имеет модификатор доступа, принимающий одно из четырех значений:public,private,protected. Атрибутом доступа по умолчанию является атрибут private. Независимо от значения атрибута доступа все методы доступны для вызова при выполнении метода класса. Если методы имеют атрибут доступа private, возможно опущенный, то тогда они доступны только для вызова только внутри методов самого класса. Такие методы считаются закрытыми. Понятно, что класс, у которого все методы закрыты, абсурден, поскольку никто не смог бы вызвать ни один из его методов. Как правило, у класса есть открытые методы, задающие интерфейс класса, и закрытые методы. Интерфейс – это лицо класса, именно он определяет, чем класс интересен своим клиентам, что он может делать, какие сервисы предоставляет клиентам. Закрытые методы составляют важную часть класса, позволяя клиентам класса не вникать во многие детали реализации класса. Эти методы клиентам класса недоступны, они о них могут ничего не знать, и, самое главное, изменения в закрытых методах класса никак не отражаются на клиентах класса при условии корректной работы открытых методов класса.

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

Свойства – член класса предоставляющий простой способ доступа к закрытым полям посредством так называемых методов доступа.

[модификатор доступа] <тип> <Имя>

{

Get

{ Блок для чтения из поля }

Set

{ Блок для записи в поле}

}

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

1.5 Объявление нового класса

Перед тем как работать с классом, ваша программа должна его объявить.

Синтаксис объявления класса

Понятие класса является наиболее важным в языке C++. Синтаксис объявления класса похож на синтаксис описания структуры. Вот его основная форма:

class <имя_класса>

{

<закрытые_элементы_класса> protected:

<защищённые_элементы_класса> public:

<открытые_элементы_класса> }<список_объектов> ;

где

 

<имя_класса>

необязательно, хотя его обычно указывают. <имя_класса> становится но-

 

вым именем типа данных, которое используется для объявления объектов

<список_объектов>

этого класса;

необязательный, объявить объекты класса можно позже, по мере необхо-

 

димости.

Функции и переменные, объявленные внутри объявления класса, становятся членами этого класса: переменные, объявленные внутри объявления класса, называются данными-членами этого класса; функции, объявленные внутри объявления класса, называютсяфункциями-членами этого класса.

По умолчанию, все функции и переменные, объявленные в классе, становятся закрытыми для этого класса. Это означает, что они доступны только для других членов этого класса. Для объявления открытых членов класса используется ключевое слово public, за которым следует двоеточие. Все функции и переменные, объявленные после слова public, доступны и для других членов класса, и для любой другой части программы, в которой содержится класс.

Компоненты, использованные при определении класса, называются его членами (members). Класс может содержать несколько членов, а может и не иметь ни одного члена. Таким образом, простейшее описание класса может выглядеть так:

class Demo {}

Рассмотрим пример:

Class X {

Public:

int m; // данные-члены

int mf (int v) { int old = m; m=v; return old; } // функция-член

};

Члены класса могут иметь разные типы. Большинство из них являются либо данные-членами, определяющими представления объекта класса, либо функциями-членами, описывающими операции над такими объектами. Так же В соответствии со стандартной терминологией ООП функции - компоненты класса или компонентные функции можно

назьюать методами. Для доступа к членам класса используется синтаксическая конструкция вида объект.член. Например:

X var; // var – переменная типа Х

Var.m = 7: // присваиваем значение члену m обьекта var

Int x = var.mf (9); // вызываем функцию-член mf() обьекта var

Как правило, класс имеет интерфейс и реализацию. Интерфейс – это часть объявления класса, к которой пользователь имеет прямой доступ. Реализация – это часть объявления, доступ к которой пользователь может получить только с помощью интерфейса. Открытый интерфейс идентифицируется с меткой public:, а реализация – меткой private:. Так же существуют компоненты класса, объявленные в секции protected,, которые называются

защищенными. Они доступны компонентным функциям не только данного

класса, но и его потомков. При отсутствии наследования ~ интерпретируются

как внутренние. Таким образом, класс описывается следующим образом:

class <имя класса>

{ private: <внутренние (недоступные) компоненты класса>;

protected: <защищенные компоненты класса>;

public: <общие (доступные) компоненты класса>;

};

Поля класса всегда описьгоаются внутри класса. В отличие от полей,

компонентные функции могут быть описаны как внутри, так и вне определения

класса. В последнем случае определение класса должно содержать прототипы

этих функций, а заголовок функции должен включать описатель видимости,

который состоит из имени класса и знака «::». Таким способом компилятору

сообщается, что определяемой функции доступны внутренние поля класса:

<тип функции> <имя класса>:: <имя функции>(<список параметров>)

{<тело компонентной функции>}