Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Вопрос №31 Инкапсуляция. Примеры реализации




Вопрос №31 Инкапсуляция. Примеры реализации

Для более надежной работы программы, Вы не должны напрямую обращаться к полям объекта. Вместо этого, Вы должны обращаться через специальные методы, которые могут проверить, например, на допустимость значения в заданном интервале или одновременно выполнить дополнительную работу по изменению состояния объекта, в зависимости от изменения значения поля - это и есть инкапсуляция. ( Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя. )

Type
TmyClass = class(TObject)
Private
AmyField: Integer; // Объявление поля целого типа
Protected
Procedure SetMyField(Val: Integer); virtual; // Объявление процедуры для записи значения свойства
Public
Property MyField: Integer read AmyField write SetMyField; // объявление свойства
End;

Вопрос №32 Свойства как механизм доступа к данным

Контроль доступа

Каждое поле, метод или свойство класса имеет атрибут, называемый видимостью. В Pascal  существуют три типа атрибутов видимости: public (открытый), private (закрытый) и protected (защищенный). К члену класса, имеющему атрибут public, можно обратиться из любого места программы, члены класса с атрибутом private доступны только внутри методов этого класса, члены класса с атрибутом protected доступны внутри методов этого класса и всех его подклассов. Атрибуты видимости могут находиться внутри класса, при этом все дальнейшие члены приобретают этот атрибут. Например:

type
A=class
private
x: integer;
protected
a: integer;
public
constructor Create(xx: integer);
begin
x: =xx; // верно, т. к. мы внутри метода класса, которому принадлежит закрытое поле x
a: =0; // верно
end;
procedure print;
end;
B=class(A)
procedure print;
begin
writeln(a); // верно, т. к. a - защищенное поле
writeln(x); // неверно, т. к. х - закрытое поле
end;
end;
...
var a1: A;
...
writeln(a1. x); // неверно, т. к. х - закрытое поле
writeln(a1. a); // неверно, т. к. a - защищенное поле
a1. print; // верно, т. к. print - открытый метод

Вопрос №33 Наследование. Примеры реализации принципа наследования

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

Type
TmyFirstClass = class(TObject)
Private
Protected
Public
Constructor Create(Val: Integer); virtual;
end;

TmySecondClass = class(TMyFirstClass)
Private
AmyField: string; // Добавили новое поле
Protected
Procedure SetMyField(Val: string); // Добавили процедуру
Public
Constructor Create(Val: Integer); override; // Перегрузили конструктор
Property MyField: string read AmyField write SetMyField; // Добавили свойство
End.

Вопрос №34 Полиморфизм. Примеры реализации

Указателю на экземпляр объектного типа может быть присвоен адрес любого экземпляра любого из дочерних типов. При обращении к свойствам и методам через этот указатель будет доступен именно экземпляр, адрес которого был присвоен, а не предок. Это и есть полиморфизм. Т. е. Вы можете иметь доступ к потомку через указатель объектного типа предка. ( Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. )

Type

TMyClass = class(TObject)

public
procedure GetData: string; virtual; abstract;

end;

TmySun1Class = class(TMyClass)
Protected
AmyField: string;

public
procedure GetData: string; override;

end;

TmySun2Class = class(TMyClass)
Protected
AmyField: Integer;

public
procedure GetData: string; override;

end;

implementation

procedure TmySun1Class. GetData: string;
begin
Result: = AmyField;
end;

procedure TmySun2Class. GetData: string;
begin
Result: =IntToStr(AmyField);
end;

Var
MyClass: TmyClass;
Class1: TmySun1Class;
Class2: TmySun2Class;
Begin
Class1: =TmySun1Class. Create;
Class2: =TmySun2Class. Create;

MyClass: = Class1;
Label1. Caption: = MyClass. GetData;
MyClass: = Class2;
Label2. Caption: = MyClass. GetData;
end;

Вопрос №35 Методы. Виртуальные и динамические методы

Метод - это процедура или функция, объединенная с данным типом столь тесно, что метод является как бы окруженным невидимым оператором with, что делает экземпляр данного типа доступными изнутри для метода. Определение типа включает заголовок метода. Полное определение метода квалифицируется в имени типа. Тип объекта и метод объекта являются двумя лицами этой новой разновидности структуры, именуемой методом.

Если посмотреть на этот код внимательно, то можно понять, что у компилятора нет возможности определить метод какого именно класса нужно вызывать. Поэтому, для определения адреса метода используются специальные таблицы, где хранятся адреса на виртуальные и динамические методы: VMT - таблица виртуальных методов и DMT - таблица динамических методов. Когда компилятор встречает указатель на виртуальный метод, то он ищет его адрес в VMT, где хранятся все адреса виртуальных методов класса унаследованных и перекрытых, поэтому такая таблица занимает много памяти, хотя и способ вызова метода работает сравнительно быстро. Динамические методы вызываются медленнее, но занимают меньше памяти, т. к. в них хранятся адреса динамических методов только данного класса и их индексы. При вызове динамических методов проводится поиск по этой таблице, если метод не найден, то поиск продолжается в DMT предков вплоть до Tobject, где вызывается стандартный обработчик вызова динамических методов. Зачем же нам все это надо? При проектировании иерархии классов предметной области, нужно статическими делать методы, которые не меняют своего поведения в потомках, т. е. при более детальном рассмотрении явления. Динамические и виртуальные методы могут меняться при переходе от общего к частному. Вспомните класс Tfield, который является общим предком для всех классов-полей таблицы. Потомки этого класса реализуют доступ к столбикам таблицы разных типов от целого числа до BLOB массива, однако, Вы можете иметь удобный доступ к этим потомкам через указатель типа Tfield и работать с ними одинаково.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...