Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
infa_2y_semestr.docx
Скачиваний:
3
Добавлен:
25.09.2019
Размер:
148.39 Кб
Скачать

№31.Инкапсуляция. Свойства.

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

Инкапсуля́ция — свойство языка программирования, позволяющее объединить и защитить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public.

Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal.

Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, полиморфизмом и наследованием).

Предостережение: Одна из наиболее распространенных ошибок — делать сокрытие реализации только ради сокрытия. Целями, достойными усилий, являются:

предельная локализация изменений при необходимости таких изменений,

прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.

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

Часто инкапсуляция может быть достигнута простейшими организационными мерами: знание того, что «вот так-то делать нельзя» иногда является самым эффективным средством инкапсуляции!

1)Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевых слов: public, private, protected, internal.

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

В Турбо Паскале средства объектно-ориентированного программирования связаны с тремя зарезервированными словами: OBJECT, CONSTRUCTOR и DESTRUCTOR и двумя стандартными директивами: PRIVATE и VIRTUAL.

Зарезервированное слово OBJECT используется для описания объекта. Описание объекта должно помещаться в разделе описания типов, например:

Type

TPoint = object

X, Y: Integer: {Координаты точки}

Color: word: {Цвет точки}

Visible: Boalean; { Признак светимости}

Procedure SetLocitlon(NewX, NewY: integer);

{Задает новое положение точки на экране}

Procedure SetColor(NewColor: word);

{Устанавливает цвет точки}

Procedure SetVisible(Vls: Boolean);

{Выводит или гасит точку}

Procedure GetLocation(var XLoc, YLoc: Integer):

{Возвращает координаты точки}

Function GetColor: word;

{Возвращает цвет точки}

Function GetVisible: Boolean;

{Возвращает признак светимости точки}

end; {Конец описания объекта TPoint}

В этом примере описывается объект TPOINT, представляющий собой данные и методы (процедуры и функции), необходимые для работы с графическими точками на экране ПК. Заметим, что инкапсулированные в объект процедуры и функции называются методами. Как видим, каждая точка характеризуется некоторым набором данных (своими координатами Х и Y цветом COLOR и признаком светимости VISIBLE). Над этими данными определены все необходимые алгоритмические действия. Если описать такой объект, то в программе можно предусмотреть сколько угодно экземпляров объекта, т.е. переменных типа объект. С помощью этих переменных можно осуществлять все предусмотренные в объекте действия, например, для переменных типа TPOINT можно высветить или погасить любую точку, переместить ее по экрану, изменить цвет. В следующем фрагменте программы точка перемещается на два пикселя вниз и вправо по экрану:

Vаr

Point: TPaint;

X. Y : Integer;

{Экземпляр объекта TPOINT}

with Point do begin

If GetVisible then

SetVlilble(False); {Погасить точку}

GetLocatlon(X,Y); {Получить координаты}

SetLocatlon(X*2, Y*2); {Задать новые координаты}

SetVisible(True) {Зажечь точку}

end;

...

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

If Point.GetVltlble then Point.SetVisible(False);

При описании объекта вначале описываются все инкапсулированные в нем данные, а затем – методы доступа к этим данным. В качестве методов используются процедуры и функции, а также конструкторы и деструкторы (см. ниже). Сами методы при описании объекта не раскрываются, указывается лишь их заголовок. Предполагается, что они описываются где-то ниже по тексту программы, например:

Type

TPoint = object

...

end;

PROCEDURE TPoint.SetVisible(Vis: Boolean);

{Реализация метода SETVISIBLE)

BEGIN

If Vis then

begin

PutPlxel(X,Y,Color);

{Высветить точку цветом Color}

Visible := True; {Установить флаг светимости}

end

else

begin

PutPlxel(X,Y,GetBkColor);

{Погасить точку цветом фона}

Visible := False;

{Сбросить признак светимости}

end

END; {TPoint.SetVisible}

Таким образом, указание методов при описании объекта подобно их опережающему описанию. Поскольку данные и методы инкапсулированы в одном объекте, все данные автоматически становятся глобальными по отношению к любым методам и могут использоваться в них произвольным образом. Точнее говоря, любой метод объекта работает с невидимым оператором WITH, обеспечивающим ему доступ ко всем полям (как мы увидим далее, поля могут следовать в объявлении типа и после объявления метода и в этом смысле не являться для него глобальными). При обращении к методу ему передается особый идентификатор SELF, представляющий собой обобщенное имя экземпляра объекта. Любой метод может использовать идентификатор SELF, чтобы явно указать на принадлежащий объекту метод или поле. Например:

type ТСоо = record

X,Y: Integer;

end:

TPoint = object

X,Y: Integer;

Procedure Init(Coo: ТСоо);

end;

Procedure TPoint(Coo: ТСоо);

begin

with Coo do begin

Self.X := X;

Self.Y := Y

end

end;

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