Собственная ветвь в иерархии классов
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
Введение
Целью моей курсовой работы является реализовать собственную ветвь в иерархии классов. Описать классы и свойства объектно-ориентированного пространства, методику создание новых классов в Delphi,создать новую ветвь классов в Delphi.
1. Классы ООП
Для поддержки ООП в язык Delphi введены объектные типы данных, с помощью которых одновременно описываются данные и операции над ними. Объектные типы данных называют классами, а их экземпляры - объектами.
Классы объектов определяются в секции type глобального блока. Описание класса начинается с ключевого слова class и заканчивается ключевым словом end. По форме объявления классы похожи на обычные записи, но помимо полей данных могут содержать объявления пользовательских процедур и функций. Такие процедуры и функции обобщенно называют методами, они предназначены для выполнения над объектами различных операций. Приведем пример объявления класса, который предназначен для чтения текстового файла в формате "delimited text" (файл в таком формате представляет собой последовательность строк; каждая строка состоит из значений, которые отделены друг от друга символом-разделителем):
type= class
// Поля: TextFile;: array of string;: Char;
// МетодыPutItem(Index: Integer; const Item: string);SetActive(const AActive: Boolean);ParseLine(const Line: string): Integer;NextLine: Boolean;GetEndOfFile: Boolean;;
Класс содержит поля (FileVar, Items, Delimiter) и методы (PutItem, SetActive, ParseLine, NextLine, GetEndOfFile). Заголовки методов, (всегда) следующие за списком полей, играют роль упреждающих (forward) описаний. Программный код методов пишется отдельно от определения класса и будет приведен позже.
Класс обычно описывает сущность, моделируемую в программе. Например, класс TDelimitedReader представляет собой "читатель" текстового файла с разбором считываемых строк на элементы (подстроки), которые отделены друг от друга некоторым символом, называемым разделителем.
Класс содержит несколько полей:- файловая переменная, необходимая для доступа к файлу;- символ, который служит разделителем элементов;- массив элементов, полученных разбором последней считанной строки;
Класс также содержит ряд методов (процедур и функций):- помещает элемент в массив Items по индексу Index; если индекс превышает верхнюю границу массива, то размер массива автоматически увеличивается;- открывает или закрывает файл, из которого производится чтение строк;- осуществляет разбор строки: выделяет элементы из строки и помещает их в массив Items; возвращает количество выделенных элементов;- считывает очередную строку из файла и с помощью метода ParseLine осуществляет ее разбор; в случае успешного чтения очередной строки функция возвращает значение True, а иначе - значение False (достигнут конец файла);- возвращает булевское значение, показывающее, достигнут ли конец файла.
Обратите внимание, что приведенное выше описание является ничем иным, как декларацией интерфейса для работы с объектами класса TDelimitedReader. Реализация методов PutItem, SetActive, ParseLine, NextLine и GetEndOfFile на данный момент отсутствует, однако для создания и использования экземпляров класса она пока и не нужна.
Свойства ООП
Помимо полей и методов в объектах существуют свойства. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам. Например, в объекте Reader присваивание свойству Active значения True вызовет открытие файла, а присваивание значения False - закрытие файла. Создание сопутствующего эффекта (открытие или закрытие файла) достигается тем, что за присваиванием свойству значения стоит вызов метода.
Объявление свойства выполняется с помощью зарезервированного слова property, например:
type = class
...
FActive: Boolean;
...
// Метод записи (установки значения) свойства
procedure SetActive(const AActive: Boolean);Active: Boolean read FActive write SetActive; // Свойство
end;
Ключевые слова read и write называются спецификаторами доступа. После слова read указывается поле или метод, к которому происходит обращение при чтении (получении) значения свойства, а после слова write - поле или метод, к которому происходит обращение при записи (установке) значения свойства. Например, чтение свойства Active означает чтение поля FActive, а установка свойства - вызов метода SetActive. Чтобы имена свойств не совпадали с именами полей, последние принято писать с буквы F (от англ. field). Мы в дальнейшем также будем пользоваться этим соглашением. Начнем с того, что переименуем поля класса TDelimitedReader: поле FileVar переименуем в FFile, Items - в FItems, а поле Delimiter - в FDelimiter.
type= class
// Поля: TextFile; // FileVar -> FFile: array of string; // Items -> FItems: Boolean;: Char; // Delimiter -> FDelimiter
...;
Обращение к свойствам выглядит в программе как обращение к полям:
var: TDelimitedReader;: Boolean;
....Active := True; // Эквивалентно Reader.SetActive(True);:= Reader.Active; // Эквивалентно IsOpen := Reader.FActive
Если один из спецификаторов доступа опущен, то значение свойства можно либо только читать (задан спецификатор read), либо только записывать (задан спецификатор write). В следующем примере объявлено свойство, значение которого можно только читать.
type= class
...: array of string;
...GetItemCount: Integer;
...ItemCount: Integer read GetItemCount; // Только для чтения!;TDelimitedReader.GetItemCount: Integer;:= Length(FItems);;
Здесь свойство ItemCount показывает количество элементов в массиве FItems. Поскольку оно определяется в результате чтения и разбора очередной строки файла, пользователю объекта разрешено лишь узнавать количество