КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Директивы видимости
Begin Begin Begin Var Var Begin Begin Begin Implementation Type Interface Объявление и реализация классов Для объявления классов (объектных типов) используется зарезервированное слово class. Определим некоторый класс графических примитивов TFigure следующим образом:
TFigure = class fColor: Byte; fThickness: Byte; fCanvas: TCanvas; procedure SetColor(Value: Byte); procedure SetThickness(Value: Byte); procedure PrepareCanvas; end;
По принятому соглашению имена классов начинаются с заглавной буквы «T», имена полей данных начинаются с буквы «F», и поля класса объявляются до методов. Класс объединяет данные, представленные атрибутами (полями) и алгоритмы (методы) по их обработке. В примере к полям данных класса относятся: поле fColor, хранящее код цвета, поле fThickness, задающее толщину линий и поле fCanvas, представляющее полотно, на котором будет происходить отображение графических примитивов. Методы класса определяют действия, выполняемые над данными. Их совокупность характеризует функциональный аспект поведения класса. Методы представляют собой процедуры и функции, принадлежащие классу. К методам класса относится метод PrepareCanvas, выполняющий подготовку полотна к работе и два метода задания значений полей данных – SetColor и SetThickness. Таким образом, в одной информационной структуре TFigure оказались объединены как исходные параметры, так и необходимые средства по выполнению их реализации. Такое объединение (сокрытие) данных и методов в качестве собственных ресурсов класса получило название инкапсуляции. Для окончательного оформления шаблона требуется поместить класс в интерфейсный раздел модуля и дать реализацию всех методов:
unit figures;
TFigure = class fColor: Byte; fThickness: Byte; fCanvas: TCanvas; procedure SetColor(Value: Byte); procedure SetThickness(Value: Byte); procedure PrepareCanvas; end;
procedure TFigure.SetColor(Value: Byte); if fColor <> Value then fColor:=Color; end;
procedure TFigure.SetThickness(Value: Byte); if fThickness <> Value then fThickness:=Value; end;
procedure TFigure.PrepareCanvas; { Подготовка полотна для рисования } end;
end.
Методы SetColor и SetThickness выполняют присвоение внутреннему полю fColor и fThickness значения в том случае, если текущее значение отличается от передаваемого. К полям класса никогда не следует обращаться напрямую, а только посредством специальных методов, обеспечивающих корректность выполнения операции присваивания. Теперь объявим переменную f класса TFigure:
f: TFigure;
Переменную f называют экземпляром класса, объектной ссылкой или просто объектом. Через объект f возможен доступ к методам и полям класса. Однако для начала необходимо создать сам объект. Для этого необходимо вызвать специальную процедуру Create, называемую конструктором:
f:=TFigure.Create;
Конструктор не объявлен в классе TFigure, однако присутствует в нем от класса TObject благодаря специальному механизму наследования классов друг от друга. В результате будет выделена область памяти в размере, необходимом для хранения объекта f. Обратите внимание, конструктор вызывается с помощью ссылки на тип, а не на экземпляр типа, в отличие от методов, которые всегда вызываются с помощью ссылки на экземпляр. Связано это с тем, что объект f на момент вызова конструктора еще не создан. После создания объекта с ним можно работать:
uses figures;
f: TCircle;
f:=TCircle.Create; f.SetColor($FF); f.SetThickness(1); f.PrepareCanvas; f.Free; end.
После выполнения методов объект f следует удалить, чтобы он не занимал места в памяти. Удаление выполняет метод Destroy, определенный в классе TObject (базовом классе), но лучше использовать Free, т.к. он инкапсулирует вызов Destroy: в начале определяется, существует ли объект и только затем выполняется вызов Destroy. В противном случае метод Free ничего не делает. Класс Figure можно модифицировать, например, явно добавить к методам конструктор Create с помощью зарезервированного слова constructor и деструктор Destroy с помощью зарезервированного слова destructor:
TFigure = class ... constructor Create; destructor Destroy; end;
В конструкторе присваиваются полям начальные значения и создается объект полотна:
constructor TFigure.Create; fColor:=$FF; fThickness:=1; fCanvas:=TCanvas.Create; end;
В деструкторе обычно выполняются действия, связанные с освобождением задействованных в течение работы объекта ресурсов:
destructor TFigure.Destroy; { Освобождение ресурсов, используемых в работе объекта } fCanvas.Free; end; Ключевая идея объектного подхода заключается в сокрытии информации. В хорошо спроектированном классе никакие изменения внутри не должны отражаться на пользователях данного класса. Директивы видимости, используемые в объектной модели языка Паскаль, позволяют ограничить доступность элементов класса. Существует четыре уровня сокрытия информации, которые задаются директивами Private (закрытый), Public (общедоступный), Protected (защищенный) и Published (публикуемый). Наиболее строгой директивой является Private, которая ограничивает видимость атрибутов и методов класса тем модулем, в котором расположен данный класс. Директива Public наоборот, наименее строга, и обеспечивает доступ к объявлениям класса из любого модуля, имеющего доступ к данному модулю. Директива Protected внутри модуля, в котором объявлен класс, действует аналогично директиве Private, а извне модуля – аналогично директиве Private. Однако вне модуля доступ к защищенным полям данных и методов все же возможен внутри производного класса. При создании классов директива Private должна использоваться только для полей и методов, действительно зависящих от класса. Любые поля и методы, доступ к которым из производных классов может потребоваться, должны быть объявлены в разделе Protected. Для директивы Published правила видимости аналогичны Public, но разница между ними заключается в том, что Published указывает компилятору добавлять информацию о типе времени выполнения (Run-Time Type Information, RTTI) для всех объявлений этого раздела. Информация RTTI необходима инспектору объектов при работе с компонентами на форме в среде Borland® Delphi. Распределим методы и поля по уровням доступности:
TFigure = class
Дата добавления: 2014-01-07; Просмотров: 484; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |