Классы, экземпляры класса, наследование, иерархия. - раздел Программирование, Объектно-ориентированное программирование Объектный Тип (Например, Tdot) Называется Классом. Переменная Данного Типа — ...
Объектный тип (например, tDot) называется классом. Переменная данного типа — объект или, что то же самое, экземпляр класса. То есть при задании
Var dDot:tDot
переменная dDot – это объект.
tDot — тип-прародитель (класс-прародитель),
· tCircle=
object(tDot) {тип-наследник (класс-наследник)};
...
end;
· tRectangle=
object(tDot) {другой наследник};
...
end;
Тут tCircle и tRectangle — прямые потомки tDot (т.е. он их прямой прародитель) и т.п.
Далее можно определить другие классы-наследники:
· tTriangle=
object(tDot)
...
end;
· tFilledTriangle=
object(tTriangle)
...
end;
· tFilledCircle=
object(tCircle)
...
end;
· tRedCirlce=
object(tCirlce)
...
end;
· tGreenCirlce=
object(tCirlce)
...
end;
· tFilledRectangle=
object(tRectangle)
...
end;
Иерархия этих классов:
Суть наследования заключается в том, что потомки могут использовать поля данных и методы прародителей без определения этих полей и методов в классе потомка. Говорят, что поля данных и методы прародителей наследуются потомками.
Пример:
type
tDot=
object
active:Boolean;
X,Y:Integer;
procedure Show;
procedure Hide;
procedure MoveBy(dX,dY:Integer);
procedure MoveTo(NewX,NewY:Integer);
procedure Init(X_,Y_:Integer);
end;
tCircle=
object(tDot)
radius:Real;
procedure Show;
procedure Hide;
procedure MoveBy(dX,dY:Integer);
procedure MoveTo(NewX,NewY:Integer);
procedure Init(X_,Y_,R_:Integer);
end;
var aDot: tDot;
aCircle: tCircle;
В теле объекта aCircle можно пользоваться полями X, Y, active, как если бы они были определены в tCircle, а не в tDot. При этом они никакого отношения не имеют к объекту aDot , т.е. к tDot.X, aDot.Y, aDot.Active. Это aCircle.X, aCircle.Y, aCircle.Active. Но по своей структуре они дублируют соответствующие поля объекта aDot.
А вот вызов методов aCircle.Show, aCircle.Hide и aCircle.Move(...) идет по-другому. Реально это tCircle.Show, tCircle.Hide и tCircle.Move(...), а методы для aDot — это tDot.Show, tDot.Hide и tDot.Move(...), "настроенные" на конкретный экземпляр класса, то есть "знающие", кого показывать, скрывать, перемещать.
Процедура Init переопределена так, что теперь надо задавать радиус, в отличие от прародителя:
Процедура Init в tCircle переопределена так, что теперь надо задавать радиус, в отличие от прародителя. Говорят, что она перекрывает соответствующий метод прародителя.
procedure tCircle.Init(X_,Y_,R_:Integer);
begin
tDot.Init(X_,Y_);
R:=R_;
end;
procedure tCircle.Hide;
var TmpColor:Word;
begin
...{нарисовать окружность цветом фона}
active:=false;
end;
procedure tCircle.MoveBy(dX,dY:Integer);
begin
Hide;
X:=X+dX;
Y:=Y+dY;
Show;
end;
procedure tCircle.MoveTo(NewX,NewY:Integer);
begin
Hide;
X:=NewX;
Y:=NewY;
Show;
end;
Замечание: в принципе типы полей данных в потомках переопределять нельзя (по сравнению с прародителями). Все поля, имеющиеся у прародителей, имеются и у всех их потомков, плюс новые поля, которые дополнительно определены для потомков. Но начиная с Delphiи в Object PASCAL была введена возможность перекрытия полей данных.
Мы пока рассматриваем только так называемые статические методы. Они вызываются так, как скомпилированы для соответствующего типа; их можно переопределять в потомках. Но зато каждый раз надо дублировать текст: процедура Move для tCircle абсолютно аналогична процедуре Move для tDot. Если бы мы не описали процедуру tCircle.Move, благодаря наследованию вызвалась бы tDot.Move! И показалось бы перемещение точки, а не окружности. Существуют также виртуальные методы, которые позволяют обеспечить большую гибкость, чем статические. Но о них речь пойдет позже.
Часто используют типы, называемые абстрактными, у которых единственное назначение — "растить" от них наследников "в разные стороны", чтобы иметь в наследниках соответствующие поля и методы. При этом изменение реализации такого класса автоматически "бесплатно" меняет поведение всех потомков. А вот интерфейс абстрактных классов стараются не менять, иначе надо переписывать почти всю программу — менять все вызовы соответствующих методов в потомках. У абстрактных классов не бывает экземпляров объектов (т.е. переменных такого типа — реально вызываемых объектов).
Пример:
type
tLocation=
object
X,Y:Integer;
procedure Init(X_,Y_:Integer);
function GetX:Integer;
function GetY:Integer;
end;
tDot=
object(tLocation)
active:Boolean;
procedure Init(X_,Y_:Integer);
procedure Show;
procedure Hide;
procedure MoveBy(dX,dY:Integer);
end;
тут tLocation — абстрактный тип; у него не будет экземпляров. Зато из любого потомка можно будет вызывать методы GetX и GetY.
Object PASCAL
(72 часа)
Вадим Валериевич Монахов, доцент кафедры вычислительной физики СпбГУ
Введение
1.1. Основной принцип ст
Алфавит языка PASCAL. Идентификаторы.
Основной алфавит языка PASCAL состоит из латинских букв и цифр.
Буквы:
ABCD...XYZ — заглавные (прописные),
abcd...xyz — строчные,
а также знак _
Арифметические операторы.
Бинарные полиморфные (тип результата определяется по правилам приведения типов,
см. далее):
+ сложение (все целые и вещественные типы, строковые типы, множества).
Логические операторы и операции отношения.
Логические операторы:
and логическое "И". Пример: a and b
or логическое "ИЛИ": a or b
xor логическое "исключающее ИЛИ": a xor b
not
Структура простейшей программы.
В PASCAL любое число пробелов, символов <TAB> или переносов на новую строку везде приводится к одному пробелу (конечно, кроме строковых выражений). Имя файла с текстом программы должно быть т
Простейшие операторы языка Object PASCAL
2.9.1. Пустой и составной операторы.
Операторы в языке PASCAL разделяется символом ";".
Пустой оператор — это просто пустая строка (или эквивален
Правила присваивания. Совместимость типов для объектов.
Для потомков при использовании их "на месте" прародителей любого уровня имеется два основных варианта совместимости типов (по вызовам и по присваиваниям) между:
1. экземплярами о
Очередь, стек, двунаправленный список.
Совершенно аналогичным образом можно создавать объект — двунаправленный список, в котором каждый узел имеет указатели как "влево" (на предыдущий узел), так и "вправо" (на послед
Классы, объекты, поля и методы.
В Object Pascal класс — тип записи, который может иметь в своем составе поля данных и методы (а также свойства, но о них будет отдельный разговор).
Пример описания класса и переменн
Свойства.
В Delphi пожелание ООП "не обращаться из программы к полям, а действовать через методы" нашло отражение в новом для ООП принципе — свойствах объекта.
Свойство определяется
Создание и уничтожение объектов. Конструкторы и деструкторы.
В Object Pascal объекты могут быть только динамическими! Любая переменная объектного типа — это указатель, но доступ к объекту идет без 'шляпки', а создание нового объекта осуществляется не операто
Области видимости объектов.
В Delphi существуют зарезервированные слова public ("общие"), protected ("защищенные") и private ("личные") для определения специальных правил видимости областей кода
Обработка исключительных ситуаций.
Во время работы программы часто встречаются исключительные ситуации: деление на 0, отсутствие места на диске или попытка писать на защищенную для записи дискету, ошибочный символ при вводе (наприме
Специальные средства для работы с MS Windows: сообщения.
Для обработки сообщений Windows в Delphi существует механизм динамических методов, называемых сообщениями. Они должны быть описаны в классе как процедуры, имеющие один параметр, передаваемый по име
События и их делегирование. Обработка событий.
События — это свойства процедурного типа. Их название принято начинать с префикса "on". Для описания события некого типа (как описать новый тип события будет рассказано далее) в объекте н
Методы класса и указатели на класс.
Некоторые методы бывает нужно вызывать без создания экземпляра класса (например, для получения информации о имени класса, размере экземпляра класса и т.п.). Такие методы называются методами класса
Дополнительные возможности Object Pascal.
4.17.4. Функции
а) могут возвращать значения определенных пользователем типов, включая сложные;
б) внутри каждой функции предопределена доступная по чтению и записи локальн
Визуальное проектирование в среде Delphi.
Перед началом работы обычно надо настроить пути к библиотеке Delphi, а в Delphi 3.0 также установить пакеты. Это связано с тем, что Windows 95 (и, тем более, NT 4.0) имеет индивидуальные настройки
Создание экранных форм. Инспектор объектов.
При входе в Delphi автоматически открывается проект "по умолчанию". Изначально это проект с пустой экранной формой, на которой пунктиром показана сетка, к которой идет привязка для выравн
Палитра компонентов.
Мы будем описывать только наиболее важные свойства и события для компонентов и перечислим только наиболее часто используемые компоненты из стандартных библиотек Delphi 3.0. Для Delphi 2.0 практичес
Общие представления об интерфейсах в Object PASCAL
Интерфейс объекта определяют методы и свойства, которые могут быть реализованы классом-наследником этого интерфейса. Они описываются аналогично абстрактным классам, так же, как абстрактные классы,
Особенности разработки DLL
Работа программ с DLL (Dynamic Link Library) поддерживается операционной системой, а не компилятором какого-либо языка программирования. Они представляют собой универсальный механизм использования
ActiveX
Подпроцессы (Threads)
Для создания дополнительного подпроцесса в программах Delphy предназначен специальный модуль (в репозитории он представлен пиктограммой Thread Object
Использование библиотек OpenGL и GLU
5.21. Создание программистом собственного компонента
Литература
1. В.В.Фаронов . Delphi 6. Учебный курс.- М.:"Нолидж", 2001.- 608 с.
Хотите получать на электронную почту самые свежие новости?
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Новости и инфо для студентов