- •Процедуры и функции
- •Объявление процедур и функций без параметров
- •Определение процедуры, основные особенности работы
- •Определение функции, основные особенности работы
- •Области видимости процедур и функций
- •Глобальные и локальные переменные
- •Оформление исходного текста процедур и функций
- •Параметры-значения и особенности работы с ними
- •Параметры-переменные и особенности работы с ними
- •Параметры-константы и особенности работы с ними
- •Открытые параметры-массивы и особенности работы с ними
- •Бестиповые параметры и особенности работы с ними
- •Процедурный тип, определение, область применения
- •Явная и неявная рекурсия
- •Типизированные константы
- •Определение файла, общие процедуры и функции для работы с ними
- •Текстовые файлы, особенности,процедуры и функции для работы с ними
- •Типизированные файлы, особенности,процедуры и функции для работы с ними
- •Нетипизированные файлы, особенности,процедуры и функции для работы с ними
- •Модули. Структура модулей Паскаль
- •Особенности использования, видимость содержимого
- •Компилляция модуля(3 режима)
- •Стандартные модули Паскаль
- •Указатели
- •Основные понятия, типы указателей, объявление
- •Способы задания значений переменных
- •Основные процедуры работы с указателем
- •Работа с диманической памятью
- •Основные ошибки при работе с указателями
- •Объекты
- •Ооп, основные понятия и определения
- •Достоинства и недостатки
- •Объявление объектного типа, поля, методов
- •Области видимости в модели объектов Паскаль
- •Наследование
- •Полиморфизм, виртуальные методы
- •Использование экземпляров объекта
- •Динамическая память и деструкторы
Области видимости в модели объектов Паскаль
С помощью директивы private при описании объекта можно ограничить область видимости полей и методов. Поля и методы объекта, описанные в секции private, будут доступны только в пределах той программной единицы (программы или модуля), где описан соответствующий объект. Такие поля и методы принято называть приватными. То есть если описать объект TLocation следующим образом:
Type
TLocation = object
private
X, Y : Word;
public
...
end;
и разместить это описание в модуле, то после подключения модуля к программе программист не сможет "напрямую" изменять значения этих полей (X, Y). Он будет вынужден вызывать соответствующие методы. По умолчанию поля и методы, описанные непосредственно за ключевым словом object, считаются общедоступными. Директива же public просто отменяет действие директивы private. То есть все последующие поля и методы будут общедоступными.
Директивы private и public могут использоваться в любом порядке сколько угодно раз, но принято при описании объектного типа после зарезервированного слова object объявлять общедоступные поля и методы и только затем после директивы private - приватные.
Наследование
Если объектный тип создается "на базе" другого существующего объекта, то имя родительского типа должно быть указано в скобках после слова object при описании потомка:
Type
<Потомок> = object(<Родитель>)
<Добавленные поля>
<Добавленные и переопределенные методы>
end;
Как уже говорилось выше, такие объекты автоматически наследуют от родителя его поля и методы. Поля могут быть добавлены (но не переопределены), а методы переопределены и добавлены.
Создадим новый объект - точку на основе существующего объекта - позиции на графическом экране. Новый объект, кроме координат, будет характеризоваться еще и цветом, может быть видимым или невидимым, перемещаться по экрану. Для этого нам понадобится добавить два свойства и несколько методов, а также переопределить методы Init и Done:
Type
TPoint = object(TLocation)
Clr : Byte; {Цвет}
Visib : Boolean; {Видимость}
Procedure Init (InitX, InitY:Word; InitColor:Byte);
{Переопределяем метод инициализации - добавляем цвет}
Function GetColor : Byte; {Возвращает цвет}
Function IsVisib : Boolean; (Возвращает видимость}
Procedure Show; {Делает видимым}
Procedure Hide; {Делает невидимым}
Procedure ChangeColor(NewColor : Byte); {Меняет цвет}
Procedure MoveTo(NewX, NewY : Word);
{Перемещает в новую позицию}
Procedure Done;
{Переопределяем для уничтожения объекта}
end;
Теперь напишем реализацию методов:
Procedure TPoint.Init (InitX, InitY:Word; InitColor:Byte);
begin
X := InitX;
Y := InitY;
Clr := InitColor;
Visib := False
end;
Как видите, этот метод добавляет новую функциональность по сравнению с предыдущим. Первые две строки тела метода повторяют (причем полностью) операторную часть метода Init объекта TLocation, две следующие - новые. И хотя такой вариант переопределения метода тоже работоспособен, в данном случае его можно упростить с помощью такого механизма, как вызов метода непосредственного родителя из метода потомка. Для этого в Turbo Pascal есть специальное зарезервированное слово inherited (в переводе с английского - унаследованный), которым мы и воспользуемся:
Procedure TPoint.Init (InitX, InitY:Word; InitColor:Byte);
begin
inherited Init(InitX, InitY);
Clr := InitColor;
Visib := False
end;
Как видите, этот метод добавляет новую функциональность по сравнению с предыдущим. Первые две строки тела метода повторяют (причем полностью) операторную часть метода Init объекта TLocation, две следующие - новые. И хотя такой вариант переопределения метода тоже работоспособен, в данном случае его можно упростить с помощью такого механизма, как вызов метода непосредственного родителя из метода потомка. Для этого в Turbo Pascal есть специальное зарезервированное слово inherited (в переводе с английского - унаследованный), которым мы и воспользуемся:
Procedure TPoint.Init (InitX, InitY:Word; InitColor:Byte);
begin
inherited Init(InitX, InitY);
Clr := InitColor;
Visib := False
end;
Текст стал несколько короче. Это будет особенно заметно при дальнейшем наследовании. Вместо слова inherited можно указать имя объекта-родителя: TLocation.Init(InitX, InitY);
Продолжим:
Function TPoint.GetColor : Byte;
begin
GetColor := Clr;
end;
Procedure TPoint.Show;
begin
Graph.PutPixel(X, Y, Clr);
Visib := True
end;
Procedure TPoint.Hide;
begin
Graph.PutPixel(X, Y, Graph.GetBkColor);
Visib := False
end;
Procedure TPoint.IsVisib : Boolean;
begin
IsVisib := Visib
end;
Procedure TPoint.ChangeColor(NewColor : Byte);
begin
Clr := NewColor;
If IsVisib then Show
end;
Procedure TPoint.MoveTo(NewX, NewY : Word);
Var Status : Boolean;
begin
Status := IsVisib;
Hide;
X := NewX;
Y := NewY;
If Status then Show
end;
Procedure TPoint.Done;
begin
Hide;
Clr := Graph.GetBkColor
end;
Дочерний объектный тип "точка" - потомок родительского объекта "позиция" создан.
