Как сделать класс в делфи

Обновлено: 06.07.2024

На этом шаге мы напомним общие понятия о классах и рассмотрим описание классов в Delphi .

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

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

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

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

Для того чтобы использовать новый тип в программе, нужно объявить переменную этого типа:

В данном примере доступ к значению свойства MyColor осуществляется через вызовы методов GetColor и SetColor . К методам в явном виде не обращаются, достаточно записать:

и компилятор оттранслирует эти операторы в вызовы соответствующих методов: записи ( SetColor ) и чтения ( GetColor ).

Особым видом свойств являются события . В Object Pascal событие - свойство процедурного типа, предназначенное для создания пользовательской реакции на то или иное входное воздействие:

  • OnMyEvent - имя свойства;
  • TMyEvent - тип свойства;
  • FOnMyEvent1 - поле процедурного типа. Вызывается при чтении значения свойства;
  • FOnMyEvent2 - поле процедурного типа. Вызывается при записи нового значения свойства;
  • asValue - значение свойства по умолчанию (может отсутствовать).

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

Каждый новый класс в Delphi должен быть объявлен глобально. Для этого используется зарезервированное слово Class . Объявление определяет функциональные возможности класса. Объявление классов в модуле производится в разделе объявления типов. Пример объявления класса и объекта в Delphi :

  • один компонент Label1 - объект типа TLabel (иначе говоря, экземпляр класса TLabel ),
  • один компонент Edit1 - объект типа TEdit (экземпляр класса TEdit ) и
  • два экземпляра класса TBitBtn .

Область видимости идентификатора компонента, объявленного в описании класса, простирается от его объявления до конца определения класса, а также распространяется на все потомки этого класса и на все блоки реализации методов класса. Область видимости идентификатора компонента зависит от раздела, в котором объявлен этот идентификатор.

В объявлениях типов класса имеются разделы частных ( private ), общих ( public ), защищенных ( protected ) и опубликованных ( published ) объявлений.

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

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

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

Свойства, расположенные в разделе опубликованных объявлений , отображаются в Инспекторе объектов (Object Inspector) .

Приобрести начальные навыки разработки иерархии классов.

1.2. Предварительные сведения

1.2.1. Объектная модель Delphi

1.2.1.1. Общий синтаксис

Поскольку класс это - тип, то он, естественно, объявляется в разделе type . Для описания нового класса в языке Delphi используется зарезервированное слово class .

Пример 1. Общий синтаксис объявления класса в Delphi:

Во всем объявлении класса единственным обязательным атрибутом является имя нового класса, которое должно быть уникальным (не должно повторяться) в рамках всей библиотеки классов, которая в Delphi называется Visual Component Library (VCL).

Подсказка

По принятому соглашению имя класса начинается с большой буквы "T". Хотя в языке Delphi регистр букв не учитывается, тем не менее, принято большие (прописные) буквы использовать для обозначения начала слова в идентификаторах, состоящих из нескольких слов.

В соответствии с принципом наследования каждый новый класс наследует реализацию и интерфейс от своего непосредственного предка, имя которого указывается в скобках после зарезервированного слова class . Библиотека VCL устроена так, что все классы имеют оного общего предка типа TObject. Поэтому если даже имя наследуемого класса не указывать, то будет подразумеваться TObject.

Пример 2. Пример двух идентичных объявлений

Подсказка

Рекомендуется явно указывать предка (даже если он является TObject) для читабельности кода. Впрочем, в реальном программировании наследовать новый класс непосредственно от TObject приходится крайне редко.

Директивы private, protected, public и published предназначены для разграничения доступа к элементам класса. Обычно они расположены в порядке строгости.

Подсказка

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

Замечание

Однако, количество директив и порядок их следования может быть, строго говоря, произвольным.

Замечание

Строго говоря, существует еще одна директива видимости - automated , предназначенная для объявления атрибутов класса, являющегося сервером автоматизации с использованием технологии COM.

Подсказка

Директива automated является устаревшей, оставлена только для обеспечения обратной совместимости и реальной необходимости использовании этой директивы нет.

Если явно не указать директиву видимости, то атрибут класса по умолчанию будет published если класс компилируется при включенной директиве компилятора или класс унаследован от класса, откомпилированного при этой включенной директиве . Во всех других случаях по умолчанию видимость - public .

Подсказка

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

Потомки класса могут повышать доступность элементов, объявленных в секциях protected и public , перемещая их в более доступные секции.

Внимание

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

Разработаем для примера объектную модель телефона.

Пример 3. Простейшее объявление некого "телефона вообще" будет выглядеть следующим образом:

1.2.1.2. Конструкторы и деструкторы

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

В любом классе есть хотя бы один конструктор с именем Create и хотя бы один деструктор Destroy, объявленные в TObject.

Пример 4. Создадим, а затем разрушим объект класса TPhone

Замечание

Класс может иметь и другие конструкторы и деструкторы, отличающиеся параметрами.

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

1.2.1.3. Поля

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

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

1.2.1.4. Методы и виды полиморфизма

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

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

Пример 5. Для простоты примера опишем только несколько методов - принять входящий звонок и ответить на него (снять трубку):

Пример 6. Определим классы для стационарного (комнатного) и мобильного телефонов, дублирующие все методы предка:

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

1.2.1.4.1. Статические методы

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

В приведенном примере для методов Ring и HandUp компилятор отведет отдельные адреса и вызвать, например, метод Ring класса TPhone из объекта-наследника не будет никакой возможности.

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

Итак, классы TRoomPhone и TCellPhone реализуют свою логику метода Ring, однако в методе Incoming, реализующем реакцию на входящий звонок, есть схожая логика - вызов звонка Ring. Поэтому было бы хорошо определить метод Incoming в классе TPhone так, чтобы он реализовывал бы общую для всех объектов логику без его полного переопределения в наследниках. Однако в методе Incoming ссылки на метод Ring формируются статически на этапе компиляции, и вызвать методы наследников нет возможности.

1.2.1.4.2. Виртуальные методы

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

Замечание

Для того чтобы сделать метод виртуальным нужно после его определения в классе добавить зарезервированное слово virtual .

Подсказка

В классах-потомках для переопределения или дополнения (не замены!) функциональности виртуального метода используется зарезервированное слово override .

Пример 7. Изменим описание классов следующим образом:

При работе с виртуальными методами следует соблюдать следующие правила:

если в классе-предке метод описан как виртуальный, то все классы-наследники, переопределяющие его, должны описывать этот метод как полиморфный с помощью слова override ;

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

формальные параметры виртуальных методов должны быть идентичны.

1.2.1.4.3. Динамические методы

Для реализации сложного полиморфизма кроме виртуальных методов в Delphi используются динамические методы. По возможностям наследования и перекрытия они аналогичны виртуальным, но отличаются несколько меньшим расходом памяти при большом количестве методов и самих классов. Для объявления метода динамическим используется директива dynamic . Перекрытие динамических методов производиться так же, как и виртуальных - с использованием слова override .

1.2.1.4.4. Абстрактные методы

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

Пример 8. Для объявления метода абстрактным используется зарезервированное слово abstract.

Задали создать класс,примерно такого плана
Имя класса Persons(Персоны),в него входят две(так скажем подкласса)персоны:преподаватели и студенты,соответственно первые разделяются на:профессоров,доцентов,ст.преподав ателей и ассистентов, вторые разделяются на(к примеру):отличник,хорошист и двоечник.Каждой персоне присваивается определённый оклад,вознаграждение:к примеру пусть у доцента будет оклад равен 10 золотых притов(10 prit),у доцента 6 золотых притов,ст.препод-3 золотых прит,препод.-2 золотых прит,ассистент-1 прит
Стипендия(оклад) студентов к примеру:отличник-1 серебряный прит,хорошист-1 бронзовый прит,двоечник-0 прит

Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Проблема в том как мне его реализовать в небольшой программе?
Возможно ли организовать выбор(преподавателей и студентов) из MainMenu и при выборе выводилось бы в Label зарплата?
p.s.Да вот задали(как говорится на словах) задание создать любой свой класс. Идей у меня не было и преподаватель предложил свою(объяснив на словах. ),

вот примерно такой класс,если его конечно можно классом назвать

Легко. У класса помимо полей есть методы и свойства. И чтобы не забивать голову на начальном этапе сделай через методы. Далее как минимум требуются конструктор и деструктор. Я предпочитаю их указывать явно и тебе советую.
ЗЫ. Поля в секции public это рабочий код, но он неправильный. Ибо зачем тогда тебе класс если можно обойтись record'ами?

Легко. У класса помимо полей есть методы и свойства. И чтобы не забивать голову на начальном этапе сделай через методы. Далее как минимум требуются конструктор и деструктор. Я предпочитаю их указывать явно и тебе советую.
ЗЫ. Поля в секции public это рабочий код, но он неправильный. Ибо зачем тогда тебе класс если можно обойтись record'ами?

Добрый день!=)
Я создал методы для двух объектов,но методы эти из класса TForm1,компонент MainMenu.
У меня не получается запуск программы,подскажите что не так?

Что это за бред.
Это вообще работать нормально не должно.
Опиши какие методы ты хочешь прикрутить к твоему Персону.

Что это за бред.
Это вообще работать нормально не должно.
Опиши какие методы ты хочешь прикрутить к твоему Персону.

Я пытаюсь сделать небольшую программу при помощи mainmenu и label,в main menu я прописал всех персонажей которые фигурируют в программе,при выборе какой либо персоны в label просто должно выводится их жалование и стиппендия. Я пытаюсь это сделать с помощью какого нибудь своего простого класса,метод я немогу придумать,я не очень отчётливо понимаю про работу(создание) классов,тем более это не консольный вывод,в Delphi7
идёт работа с компонентами я уже совсем запутался куда прописывать свой класс,что изменять,не изменить бы чего лишнего.

Как и большинство современных языков программирования Delphi предоставляет среду разработки, в которой при создании программы могут быть реализованы принципы ООП.

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

Преимущества ООП

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

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

Создание классов в Delphi

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

Следует знать, что ООП в частности классы в Delphi имеет такие особенности:

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


Применение ООП в Delphi открывает широкие возможности для его применения в различных областях. В частности написание программ способных облегчить администрирование linux, усовершенствовать различные алгоритмы. Для это достаточно применить CLX-библиотека, позволяющая разрабатывать полноценные приложения для различных операционных систем.

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

1.1.1. Основные понятия

Любой класс может быть порожден от другого класса. Для этого при его объявлении указывается имя класса-родителя:

TChildClass = class(TParentClass) Порожденный класс автоматически наследует поля, методы и свойства своего родителя и может добавлять к ним новые. Таким образом, принцип наследования обеспечивает поэтапное создание сложных классов и разработку собственных библиотек классов.

Все классы Delphi порождены от единственного родителя - класса TObject. Этот класс не имеет полей и свойств, но включает в себя методы самого общего назначения, обеспечивающие весь жизненный цикл любых объектов - от их создания до уничтожения. Программист не может создать класс, который не был бы дочерним классом TObject. Следующие два объявления идентичны:

TaClass = class(TObject) TaClass = class

Принцип наследования приводит к созданию ветвящегося дерева классов, постепенно разрастающегося при перемещении от класса TObject к его потомкам. Каждый потомок дополняет возможности своего родителя новыми и передает их своим потомкам. Замечу, что дочерний класс не может удалить какую-либо сущность родительского класса. В отличие от С++, дочерний класс не может иметь два и более родительских классов, то есть в Delphi запрещено множественное наследование.

1.1. Классы

Рис. 1.1. Фрагмент дерева классов Delphi

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

В Delphi полиморфизм достигается не только описанным выше механизмом наследования и перекрытия методов родителя, но и их виртуализацией (см. далее), позволяющей родительским методам обращаться к методам своих потомков.

Читайте также: