- •С примерами на Object pascal (72 часа)
 - •Введение
 - •1.1. Основной принцип структурного программирования
 - •"Инкапсуляция времени выполнения" — полное отсутствие.
 - •"Структурные типы" —хорошо;
 - •1.2. Основные задачи структурного программирования
 - •1.3. Основные принципы объектно-ориентированного программирования (ооп)
 - •2.1. Алфавит языка pascal. Идентификаторы.
 - •2.2. Простые и составные специальные символы, используемые на пк.
 - •2.3. Стандартные типы данных. Двоичное представление чисел и дополнительный код.
 - •2.4. Особенности работы с некоторыми типами данных
 - •2.5. Арифметические операторы.
 - •2.6. Логические операторы и операции отношения.
 - •2.7. Потеря точности, потеря порядка и переполнение при арифметических операциях.
 - •2.8. Структура простейшей программы.
 - •2.9. Простейшие операторы языка Object pascal
 - •1) Цикл от меньшего к большему значению:
 - •2) Цикл от большего к меньшему значению:
 - •2.10. Структурные типы данных
 - •2.11. Указатели. Динамические переменные. Динамическое выделение и высвобождение памяти
 - •2.12. Процедуры и функции. Формальные и фактические параметры. Передача параметров по ссылке, по значению и через указатель.
 - •2.13. Локальные и глобальные переменные. Побочный эффект функции. Вложенность процедур и функций. Правила видимости.
 - •2.14. Пример на правила видимости и передачи параметров
 - •2.15. Рекурсия
 - •2.1. Инкапсуляция. Объект. Поля данных и методы объекта
 - •3.2 Задание модуль класса (статическая объектная модель)
 - •4.10. Создание и уничтожение объектов. Конструкторы и деструкторы.
 - •4.11. Наследование. Статические, виртуальные, динамические и абстрактные методы.
 - •4.12. Области видимости объектов.
 - •4.13. Обработка исключительных ситуаций.
 - •4.14. Специальные средства для работы с ms Windows: сообщения.
 - •4.15. События и их делегирование. Обработка событий.
 - •4.16. Методы класса и указатели на класс.
 - •4.17. Дополнительные возможности Object Pascal.
 - •5. Визуальное проектирование в среде Delphi.
 - •5.8. Создание экранных форм. Инспектор объектов.
 - •5.9. Палитра компонентов.
 - •6. Интерфейсы и множественное наследование
 - •6.1. Общие представления об интерфейсах в Object pascal
 - •6.2. Реализация интерфейсов свойством
 - •6.3. Различение имен при реализации нескольких интерфейсов
 - •5.11. Спецификаторы вызовов процедур и функций
 - •5.12. Динамические массивы
 - •5.13. Перезагрузка (overloading) методов, процедур и функций
 - •5.14. Параметры по умолчанию
 - •5.17. Технологии dde и ole
 - •5.18. Технология ActiveX
 - •5.20. Использование библиотек OpenGl и glu
 - •5.21. Создание программистом собственного компонента Литература
 
6.2. Реализация интерфейсов свойством
Директива implements в описании свойства класса позволяет делегировать реализацию интерфейса свойству в реализуемом классе. Например, свойство
property MyInterface: IMyInterface
read FMyInterface
implements IMyInterface;
описывает свойство, реализующее интерфейс ImyInterface. Директива implements должна быть последней в описании свойства и может иметь перечисление после нее имен нескольких интерфейсов, разделенных запятыми. Делегируемое свойство:
может иметь тип класса или интерфейса.
не может быть массивом или иметь спецификатор индекса.
должно иметь спецификатор read; если имеется метод “read”, он не может быть динамическим (хотя может быть виртуальным) или описывать директиву message.
Если свойство типа интерфейс, соответствующий интерфейс или его интерфейс-прародитель должен присутствовать в списке интерфейсов класса, где продекларировано свойство.
Делегируемое свойство должно возвращать объект, чей класс полностью реализует интерфейс, без использования выражений различия методов (“мэппинга”), см. далее. Например:
type
IMyInterface =
interface
procedure P1;
procedure P2;
end;
TMyClass =
class(TObject, IMyInterface)
FMyInterface: IMyInterface;
property MyInterface: IMyInterface
read FMyInterface
implements IMyInterface;
end;
tatherClass=
class(tany,ImyInterface)
…
end;
var
aMyClass: TMyClass;
aOtherClass:tOtherClass;
aMyInterface: IMyInterface;
begin
aMyClass := TMyClass.Create;
aMyClass.FMyInterface := ... // объект, чей класс реализует ImyInterface
aMyInterfase:=aMyClass.myInterfase// ссылка на тот же объект
aMyInterface := MyClass;// допустимо, так как ImyInteface – интерфейс-прародитель для tMyClass; ссылка на объект,агрегирующий
aMyInterface.MyInterface:=totherClass.create;//это второй объект
aMyInterface.P1;
aMyInterfase.MyInterfase.P1;//это вызов методаP1 для второго объекта
end;
6.3. Различение имен при реализации нескольких интерфейсов
Когда класс реализует два или более интерфейсов, имеющих методы с одинаковыми именами, для разрешения конфликта имен используют выражения различения методов в виде “мэппинга”:
procedure interface.interfaceMethod = implementingMethod;
или
function interface.interfaceMethod = implementingMethod;
где implementingMethod — это метод, определенный в классе, или одном из его прародителей. Он может быть методом, описанном далее в описании класса, но не может быть “private” методом класса или одного из его прародителей, описанном в другом модуле. Пример:
type
TMemoryManager = class(TInterfacedObject, IMalloc, IErrorInfo)
function IMalloc.Alloc = Allocate;
procedure IMalloc.Free = Deallocate;
...
end;
Выражения различения методов не могут использовать мэппинг, имеющийся в классах-прародителях.
В спецификации интерфейса может быть описан уникальный глобальный идентификатор — globally unique identifier (GUID), представленный в виде строки литералов, заключенной в скобки:
['{xxxxxxxx–xxxx–xxxx–xxxx–xxxxxxxxxxxx}']
где каждый X это 16-ричная цифра ( от 0 до F). GUID — это 16-байтовое двоичное число, уникально идентифицирующее интерфейс.
Если у интерфейса есть GUID, можно его использовать для запросов к переменной интерфейса, получить ссылки на его реализации. Типы tGUID и pGUID, определенные в модуле System, используются для работы с переменными типа GUID и указателями на такие переменные. Их описание следующее:
type
pGUID = ^tGUID;
tGUID =
record
D1: Longword;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;
Можно описать типизированную константу типа TGUID, например, имеющую имя IID -IMalloc:
const IID_IMalloc: TGUID = '{00000002-0000-0000-C000-000000000046}';
Вызов в процедуре переменной типа GUID аналогичен соответствующему типу interfase. Может быть использовано как значение, так и постоянный параметр типа TGUID. Например:
function Supports(Unknown: IUnknown; const IID: TGUID): Boolean;
Таким образом, вызов Supports может быть сделан одним из двух путей:
if Supports(Allocator, IMalloc) then ...
или
if Supports(Allocator, IID_IMalloc) then ...
