Собственная ветвь в иерархии классов
Классы и свойства объектно-ориентированного пространства. Методика создания новых классов в delphi: выбор родительского класса, изменение существующих компонентов, создание подклассов для элементов управления windows. Создание новой ветви классов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 07.07.2012 |
Размер файла | 13,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Введение
Целью моей курсовой работы является реализовать собственную ветвь в иерархии классов. Описать классы и свойства объектно-ориентированного пространства, методику создание новых классов в Delphi,создать новую ветвь классов в Delphi.
1. Классы ООП
Для поддержки ООП в язык Delphi введены объектные типы данных, с помощью которых одновременно описываются данные и операции над ними. Объектные типы данных называют классами, а их экземпляры - объектами.
Классы объектов определяются в секции type глобального блока. Описание класса начинается с ключевого слова class и заканчивается ключевым словом end. По форме объявления классы похожи на обычные записи, но помимо полей данных могут содержать объявления пользовательских процедур и функций. Такие процедуры и функции обобщенно называют методами, они предназначены для выполнения над объектами различных операций. Приведем пример объявления класса, который предназначен для чтения текстового файла в формате "delimited text" (файл в таком формате представляет собой последовательность строк; каждая строка состоит из значений, которые отделены друг от друга символом-разделителем):
type
TDelimitedReader = class
// Поля
FileVar: TextFile;
Items: array of string;
Delimiter: Char;
// Методы
procedure PutItem(Index: Integer; const Item: string);
procedure SetActive(const AActive: Boolean);
function ParseLine(const Line: string): Integer;
function NextLine: Boolean;
function GetEndOfFile: Boolean;
end;
Класс содержит поля (FileVar, Items, Delimiter) и методы (PutItem, SetActive, ParseLine, NextLine, GetEndOfFile). Заголовки методов, (всегда) следующие за списком полей, играют роль упреждающих (forward) описаний. Программный код методов пишется отдельно от определения класса и будет приведен позже.
Класс обычно описывает сущность, моделируемую в программе. Например, класс TDelimitedReader представляет собой "читатель" текстового файла с разбором считываемых строк на элементы (подстроки), которые отделены друг от друга некоторым символом, называемым разделителем.
Класс содержит несколько полей:
FileVar - файловая переменная, необходимая для доступа к файлу;
Delimiter - символ, который служит разделителем элементов;
Items - массив элементов, полученных разбором последней считанной строки;
Класс также содержит ряд методов (процедур и функций):
PutItem - помещает элемент в массив Items по индексу Index; если индекс превышает верхнюю границу массива, то размер массива автоматически увеличивается;
SetActive - открывает или закрывает файл, из которого производится чтение строк;
ParseLine - осуществляет разбор строки: выделяет элементы из строки и помещает их в массив Items; возвращает количество выделенных элементов;
NextLine - считывает очередную строку из файла и с помощью метода ParseLine осуществляет ее разбор; в случае успешного чтения очередной строки функция возвращает значение True, а иначе - значение False (достигнут конец файла);
GetEndOfFile - возвращает булевское значение, показывающее, достигнут ли конец файла.
Обратите внимание, что приведенное выше описание является ничем иным, как декларацией интерфейса для работы с объектами класса TDelimitedReader. Реализация методов PutItem, SetActive, ParseLine, NextLine и GetEndOfFile на данный момент отсутствует, однако для создания и использования экземпляров класса она пока и не нужна.
Свойства ООП
Помимо полей и методов в объектах существуют свойства. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам. Например, в объекте Reader присваивание свойству Active значения True вызовет открытие файла, а присваивание значения False - закрытие файла. Создание сопутствующего эффекта (открытие или закрытие файла) достигается тем, что за присваиванием свойству значения стоит вызов метода.
Объявление свойства выполняется с помощью зарезервированного слова property, например:
type
TDelimitedReader = class
...
FActive: Boolean;
...
// Метод записи (установки значения) свойства
procedure SetActive(const AActive: Boolean);
property Active: Boolean read FActive write SetActive; // Свойство
end;
Ключевые слова read и write называются спецификаторами доступа. После слова read указывается поле или метод, к которому происходит обращение при чтении (получении) значения свойства, а после слова write - поле или метод, к которому происходит обращение при записи (установке) значения свойства. Например, чтение свойства Active означает чтение поля FActive, а установка свойства - вызов метода SetActive. Чтобы имена свойств не совпадали с именами полей, последние принято писать с буквы F (от англ. field). Мы в дальнейшем также будем пользоваться этим соглашением. Начнем с того, что переименуем поля класса TDelimitedReader: поле FileVar переименуем в FFile, Items - в FItems, а поле Delimiter - в FDelimiter.
type
TDelimitedReader = class
// Поля
FFile: TextFile; // FileVar -> FFile
FItems: array of string; // Items -> FItems
FActive: Boolean;
FDelimiter: Char; // Delimiter -> FDelimiter
...
end;
Обращение к свойствам выглядит в программе как обращение к полям:
var
Reader: TDelimitedReader;
IsOpen: Boolean;
...
Reader.Active := True; // Эквивалентно Reader.SetActive(True);
IsOpen := Reader.Active; // Эквивалентно IsOpen := Reader.FActive
Если один из спецификаторов доступа опущен, то значение свойства можно либо только читать (задан спецификатор read), либо только записывать (задан спецификатор write). В следующем примере объявлено свойство, значение которого можно только читать.
type
TDelimitedReader = class
...
FItems: array of string;
...
function GetItemCount: Integer;
...
property ItemCount: Integer read GetItemCount; // Только для чтения!
end;
function TDelimitedReader.GetItemCount: Integer;
begin
Result := Length(FItems);
end;
Здесь свойство ItemCount показывает количество элементов в массиве FItems. Поскольку оно определяется в результате чтения и разбора очередной строки файла, пользователю объекта разрешено лишь узнавать количество элементов.
В отличие от полей свойства не имеют адреса в памяти, поэтому к ним запрещено применять операцию. Как следствие, их нельзя передавать в var- и out-параметрах процедур и функций.
2. Методика создания новых классов в Delphi
В этой главе рассматриваются основные этапы создания компонентов для Delphi.
Выбор родительского класса.
Создание модуля для компонента.
Создание свойств, методов и событий.
Тестирование и отладка компонента.
Оформление компонента.
Два первых этапа относительно просты и целиком описываются в этой главе. Три других более подробно рассматриваются в отдельных главах.
В этой главе анализируются все этапы разработки компонента, кроме, возможно, самого главного - этапа «вынашивания» основной идеи компонента, то есть решения для себя вопроса: чем будет отличаться новый компонент от существующих и будет ли он полезен в других программах или другим программистам. Последнее обстоятельство - возможное тиражирование компонента - очень важно, так как если компонент используется всего один раз или в одной-единственной программе, вряд ли стоит тратить дополнительные усилия на придание ему функциональности именно компонента, скорее всего, задачу с успехом решит специализированный модуль.
Выбор родительского класса
Компонентом может быть практически любой элемент программы, которым вы хотите манипулировать на этапе разработки. Создать компонент - означает создать новый класс, являющийся наследником одного из уже существующих классов. Вы можете создать компонент несколькими путями:
изменением существующих компонентов;
созданием новых оконных компонентов;
созданием новых графических (не оконных) компонентов;
созданием подклассов для элементов управления Windows;
созданием невизульных компонентов.
В табл. 2.1 перечислены компоненты и классы, которые лучше всего брать за основу для каждого подхода.
Таблица 2.1 - Рекомендуемые родительские классы
Цель |
Рекомендуемые классы |
|
Изменить существующий компонент |
Любой существующий компонент (например, TButton или TListBox) или класс TCustomXXXX (например, TCustomListBox) |
|
Создать оконный компонент |
TWinControl или TCustomControl |
|
Создать графический компонент |
TGraphicControl |
|
Создать подкласс для элемента управления |
Любой компонент Windows |
|
Создать невизуальный компонент |
TComponent |
Можно также наследовать классы, которые не являются компонентами и не могут быть помещены на форму (например, TRegIniFile и TFont). В этом случае вы должны добавить в класс свойства, позволяющие ему взаимодействовать со средой Delphi на этапе разработки программы, потому что только при этом условии вновь созданный класс будет компонентным классом. Вообще, удачный выбор родительского класса в значительной степени упрощает проблему создания нового компонента. Помните замечательный девиз корпорации Borland: "Не нужно изобретать велосипед - просто наследуйте его!".
Изменение существующих компонентов
Самый простой способ создать компонент - изменить уже существующий. При этом в качестве родительского класса чаще всего используется соответствующий компонентный класс или класс TCustomXXXX. Как уже отмечалось в главе 3, классы TCustomXXXX реализуют основную функциональность соответствующих компонентов, но не публикуют многие их свойства и события. Наследовать от таких классов лучше тогда, когда новый компонент должен отличаться от своего предшественника набором свойств и событий. Пусть, например, создается простой компонент для отображения текущего системного времени. Для вывода текстовых сообщений хорошо подходит метка TLabel. Однако она имеет свойство Caption, которое для наших целей публиковать нельзя (это свойство в новом компоненте предназначено только для вывода системного времени). Выход из положения - наследовать новый компонент от класса TCustomLabel и оставить свойство Caption в секции protected (именно в этой секции свойство Caption объявляется в классе TCustomLabel). Тогда в самом компоненте можно обращаться к этому свойству, но ни в наследниках компонента, ни в работающей программе этого сделать нельзя.
Простой компонент для отображения на форме системного времени.
Он иллюстрирует два момента:
1) Сокрытие свойств, которые противоречат функциональности компонента.
2) Использование в компоненте уже существующего компонента. ===================================================================} interface
uses SysUtils, Classes, Controls, StdCtrls, ExtCtrls; type TFarClock = class(TCustomLabel) private { Private declarations } FTimer: TTimer; protected { Protected declarations } procedure UpdateClock(Sender: TObject); public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property Align; // property Caption; Не публикуем это свойство! // Не публикуем также несколько других свойств // (AutoSize, Alignment, BiDiMode и т.п.), которые // не используются в новом компоненте. property Color; property Font; property ParentColor; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property Transparent; property Visible; end; procedure Register; implementation constructor TFarClock.Create(AOwner: TComponent); {В конструкторе создается вложенный компонент FTimer и инициируется его работа } begin inherited Create(AOwner); // Унаследованный конструктор FTimer := TTimer.Create(Self); // Создаем таймер FTimer.OnTimer := UpdateClock; // Его обработчик OnTimer FTimer.Enabled := True // Запускаем таймер end; procedure TFarClock.UpdateClock(Sender: TObject); { Эта процедура - обработчик события OnTimer встроенного таймера. Обновляет отображение времени в компоненте } begin Caption := TimeToStr(Time); // Изменяем надпись Invalidate; // Отрисовываем компонент end; procedure Register; begin RegisterComponents('Far', [TFarClock]); end; end. Вместе со свойством Caption не публикуются многие другие свойства стандартной метки, которые излишни в новом компоненте. Например, значение свойства AutoSize всегда предполагается равным True, поэтому не публикуются свойства Alignment, Height и Width.
Создание оконных компонентов
Оконные компоненты - это объекты, которые появляются в окне и с которыми пользователь может взаимодействовать. Каждый оконный компонент имеет дескриптор оконного ресурса, содержащийся в свойстве Handle, с помощью которого операционная система управляет этим компонентом. Оконный ресурс позволяет компоненту получать фокус ввода и может быть передан API-функциям Windows. Все оконные компоненты являются наследниками класса TWinControl. В них входят так называемые контейнеры компонентов (формы, панели, компоненты группирования), а также компоненты, нуждающиеся в фокусе ввода (кнопки, списки, поля ввода). Хотя вы можете наследовать оригинальный компонент непосредственно от TWinControl, Delphi предоставляет для этих целей также класс TCustomControl, который является наследником от TWinControl и дополняет его свойством Canvas.
Создание графических компонентов
Если получение фокуса ввода вашим компонентом не предусматривается, вы можете сделать его графическим компонентом. Графические компоненты идентичны оконным, но не имеют оконных процедур, поэтому потребляют меньше системных ресурсов. Компоненты типа TLabel, которые никогда не получают фокус ввода, являются графическими. Хотя эти элементы не могут получить фокус ввода, вы можете заставить их реагировать на определенные события мыши (щелчок, двойной щелчок и т.п.). Чтобы создать собственные графические компоненты, наследуйте их от класса TGraphicControl. Этот класс предоставляет канву для рисования и в Windows может управлять всеми событиями WM_PAINT (нужно просто перекрыть метод Paint).
Создание подклассов для элементов управления Windows
В традиционном Windows-программировании вы можете создать собственный компонент путем объявления нового оконного класса и регистрации его в Windows. Оконный класс содержит информацию, общую для всех экземпляров одного типа компонентов. Вы можете создать оконный класс на основе уже существующего (это называется созданием подклассов), поместить свой элемент в динамическую библиотеку (DLL) - так же как стандартные элементы управления Windows - и создать интерфейс для элемента. Примеры создания подклассов элементов управления Windows можно найти в компонентах из модуля StdCtrls, содержащего стандартные компоненты Windows (такие как TEdit).
класс delphi ветвь windows
3. Создание новой ветви классов
type
TMyPanel = class(TPanel)
public
procedure CMMouseEnter (var message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave (var message: TMessage); message CM_MOUSELEAVE;
end;
var
Form1: TForm1;
MyPanel1:TMypanel;
Implementation
{$R *.dfm}
procedure TMyPanel.CMMouseEnter (var message: TMessage);
begin
Form1.Label1.Caption := 'Мышь на панели';
end;
procedure TMyPanel.CMMouseLEAVE (var message: TMessage);
begin
Form1.Label1.Caption :='Мышь вне панели';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyPanel1 := TMyPanel.Create(self);
with MyPanel1 do
begin
Parent := Form1;
Visible := true;
Left := 100;
Top := 100;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CLose;
end;
end.
Заключение
В данной работе был реализован способ создание новой ветви классов. Подробно описано и показано в программе.
Список литературы
1. А.Я. Архангельский Приемы программирование в Delphi на основе VCL.- М.: ООО <<Бином-Пресс>>, 2006 г. - 944 c.
2. В. Фаронов Искусство создания компонентов Delphi (+CD). Библиотека программиста. - СПб.: Питер, 2005. - 463 с.
3. М. Кэнту Delphi 7 для профессионалов.
4. Фленов М.Е. Delphi 2005. Секреты программирования - СПб.: Питер, 2006. - 266 с.
Размещено на Allbest.ru
Подобные документы
Цели объектно-ориентированного программирования, абстрактные классы и адреса базовых классов, множественное и виртуальное наследование. Инициализация элементов производного класса, программный вызов конструкторов базового и производного классов.
реферат [21,8 K], добавлен 31.10.2011Изучение принципов объектно-ориентированного программирования. Понятие класса в Delphi, в основе которых лежат три фундаментальные принципы - инкапсуляция, наследование и полиморфизм. Разработка классов транспортных средств и структур классов (кошки).
курсовая работа [29,7 K], добавлен 29.10.2011Реализация абстрактных методов демонстрации иерархии классов: постановка задачи, имитирующей жизнь двух племен муравьев, создание класса-родителя "муравей", определяющего методы и свойства, которые унаследуют потомки. Программное и аппаратное обеспечение.
курсовая работа [630,0 K], добавлен 19.03.2012Краткая характеристика предметной области. Создание диаграммы прецедентов, последовательности, сотрудничества, классов, размещения, компонентов. Добавление деталей к описаниям операций и определение атрибутов КЛАССОВ. Генерация программного кода C++.
курсовая работа [185,0 K], добавлен 29.06.2011Изображение класса на диаграмме UML. Инкапсуляция как средство защиты его внутренних объектов. Использование принципа полиморфизма для реализации механизма интерфейсов. Создание новых классов путем наследования. Ассоциация как вид отношений между ними.
лекция [516,6 K], добавлен 03.12.2013Обзор технологии OpenStack, область ее применения. Реализация библиотеки классов. Реализация базовых классов и интерфейсов архитектуры. Создание виртуального сервера. Интеграция разработанной библиотеки классов и архитектура проектного решения.
дипломная работа [1,0 M], добавлен 09.08.2016Ознакомление с программой проведения сборки компьютера из деталей, имеющихся в базе данных. Рассмотрение правил создания иерархии классов. Описание основных методов и пользовательского интерфейса. Изучение системных требований и текстов основных классов.
курсовая работа [710,2 K], добавлен 26.07.2014Создание программы "Ликероводочный завод" на основе объектно-ориентированного подхода: проектирование иерархии классов и интерфейсов на основе выделенных сущности. Применение принципа инкапсуляции к классам. Тестирование готового программного продукта.
курсовая работа [573,2 K], добавлен 23.06.2012Иерархия и типы классов в программе, особенности обеспечения наследования. Наследование по принципу подчиненности. Включение в другие классы или делегирование. Понятие изолированных классов. Конструкторы и деструкторы. Иерархия классов NET Framework.
презентация [91,8 K], добавлен 09.12.2013Разработка структуры класса "Экран курсового проектирования", которая будет основой для хранения информации о студентах, выполняющих курсовые работы. Реализация визуального приложения для тестирования иерархии классов на языке программирования С++.
курсовая работа [3,3 M], добавлен 18.03.2011