Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_po_OOP док.doc
Скачиваний:
13
Добавлен:
28.03.2015
Размер:
313.34 Кб
Скачать

Методы класса и данные класса

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

(сколько лап у кошки?)Как этого реализовать

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

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

2. Можно написать глобальную функцию или процедуру которая будет доступна этим классам.

3. Объявление метода класса.

Class function……………..

* Классовые методы нельзя применять в отношении конкретного экземпляра.Они могут быть и виртуальные!

Инкапсуляция

ООП требует чтобы данные были скрыты или инкапсулированы внутри использующего их класса. Использование методов доступамк внутренним данным объекта уменьшает шансы появления ошибок.(например класс TDate- методы могут проверить корректность изменения даты)

Инкапсуляция позволяет легко вносить изменения во внутреннюю структуру класса, не меняя его внешнее представление.

Таким образом, класс – это черный ящик, с небольшой видимой частью – интерфейсом класса. Интерфейс позволяет другим частям программы осуществлять доступ к объектам данного класса и использовать их. Это инкапсуляция, основанная на классах. Object Pascal позволяет использовать и другой подход – инкапсуляцию основанную на модулях.

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

Директивы видимости

Для поддержки инкапсуляции основанной на классах в Object Pascal введены следующие спецификаторы доступа:

Public- определяет поля и методы к которым может обращаться любая часть программы.

Private - отмечает поля и методы класса, которые не доступны в не модуля, в котором определен класс.

Protected - определяет частично доступные поля и методы, доступ к ним имеют только методы данного класса и всех производных классов.

Как правило все поля класса относятся к категории PRIVATE а методы объявляются с использованием спецификатора PUBLIC.(это нормальный стиль ООП)

Спецификаторы доступа решают только одну задачу – с их помощью можно ограничить доступ к определенным членам класса, объявленного в интерфейсной части модуля, со стороны кода не являющегося частью этого модуля. Т.е. это значит что если в одном и том же модуле объявлены 2 класса, поля этих классов (даже если они объявлены как Private и Protected) , ничем не защищены от взаимного доступа.

Type TDate=class

private

month, day, year:integer

Public

Procedure SelValue(m,d,y:integer); overload;

Procedure SetValue(newDate:TDateTime); overload;

Function,,,,,,,,,,,,,,

Function……………. procedure increase.

…………….

End;

Procedure TDate.SetValue(m,d,y:integer);

Begin

Fdate:=EncodeDate(y,m,d);

End;

В данном примере метод GetText возвращает дату в виде строки. Добавление функиций типа Getmonth getyear getday не целесообразно, так как функции реализующие прямой доступ ко всем полям подряд могут уменьшить эффект от инкапсуляции, усложнив изменение внутренней структуры класса(при необходимости);

Изменим внутреннюю структуру класса. Вместо полей введем новое поле типа TdateTime.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]