- •1. Новые концепции ооп в языке Oblect Pascal
- •2. Объектно-ориентированный подход в программировании
- •Основные понятия
- •3. Понятие класса и объекта
- •4. Поля, методы и свойства объекта
- •5. Ключевое слово Self, примеры использования
- •6. Перегруженные методы
- •7. Создание и удаление объектов
- •9. Инкапсуляция и модули
- •10. Директивы видимости
- •8. Инкапсуляция
- •11. Инкапсуляция при помощи свойств
- •12. Свойства-массивы
- •13. Индексированные свойства
- •14. Свойства и иерархия классов
- •15. Конструкторы, перегрузка конструкторов, 16. Деструкторы
- •17. Ссылочная модель объектов Delphi
- •18. Наследование
- •19. Совместимость типов
- •20. Полиморфизм и позднее связывание
- •21. Виртуальные, динамические методы
- •22. Абстрактные методы
- •23. Бе6зопасное преобразование типов
- •24. Ссылки на класс
- •25. Создание компонентов при помощи ссылок на класс
- •26. Интерфейсы
- •27. Технические приемы, связанные с использованием интерфейсов (делегирование, использование директивы implements)
- •28. Исключительные ситуации
- •29. Порядок выполнения программы и блок finally
- •30. Классы исключений
- •31. Исключения и отладка приложений
- •32. Класс tObject, использование методов класса Tobject
- •33. Понятие события
- •34. Обработчики событий. Делегирование в Delphi
- •35. События стандартных визуальных компонент и их использование
17. Ссылочная модель объектов Delphi
Использование памяти в Delphi осуществляется в соответствии со следующими правилами. 1) Прежде чем использовать объект, его нужно создать. 2) После использования ненужный объект нужно уничтожить. 3)Уничтожать объект допускается только один раз. Необходимо ли писать это вручную? Delphi предлагает 3 разновидности управления памятью для динамических переменных, т.е. тех, которые располагаются в куче. 1) Если объект создаётся явно в коде приложения, значит уничтожать его необходимо самостоятельно, иначе занимаемая им память будет недоступна другим объектам. 2)Если мы создаём компонент, то можно указать другой компонент, который будет являться его владельцем. При этом владелец компонента передается конструктору компонента в качестве аргумента. Владелец становится ответственным за все уничтожение объектов, которыми он владеет, т.е. при уничтожении форма уничтожает все компоненты, которыми она владеет. 3) Когда выделяется память для строк динамических массивов и объектов, представленных переменными интерфейсов, Delphi автоматически освобождает память в момент выхода из области видимости ссылки. Однократное освобождение объектов. Если обратиться к деструктору Destroy дважды, произойдёт ошибка. Если не забыть установить ссылку на объект в nil, то к методу Free можно обращаться несколько раз без каких-либо проблем. Free – это статический метод, и его адрес известен во время компиляции, а Destroy – виртуальный метод, адрес которого определяется в процессе выполнения программы. При этом осуществляется анализ типа объекта – опасная операция в случае не существования объекта. if assigned(anObj) then … if anObj <> nil then…
18. Наследование
В ООП имеется возможность определить новый класс на основе существующего. Эта технология называется наследованием (созданием производного класса). Механизм наследования является одним из фундаментальных элементов ООП. Для определения подкласса необходимо указать предка в начале объявления.
Пример:
Delphi каждый раз это автоматически делает при создании новой формы.
Tform1 = class (Tform)
…….;
Класс TForm1 наследует все поля, методы и т.п. от класса TForm. Т.е. можно применить в отношении объекта TForm1 любой публичный метод класса Tform. Класс Tform в свою очередь наследует некоторые из своих методов от другого класса и так вплоть до класса TObject, который явлеется предком любого класса в Object Pascal’e.
Пример:
Создадим новую версию класса TDate в котором будет изменена функция GetText;
TNewDate = class (TDate)
Public
Function GetText : string;
End;
Класс TNewDate порождается от класса Tdate. Говорят: Tdate явл.классом предком или родительским классом для TNewDate.
TNewDate это производный класс, класс потомок, дочерний класс для Tdate. Код метода GetText класса TNewDate будет откомпилирован без ошибок только в случае, если написать его в том же модуле, в котором находится класс Tdate. Выход – protected. Описание большинства полей как protected делает классы более гибкими и упрощает написание подклассов. Но это разрушает идею инкапсуляции. Гибкость и инкапсуляция зачастую являются прямопротивоположными целями. Если приходится выбирать – предпочтение надо отдавать инкапсуляции. Иначе программа не будет соответствовать принципам ООП. (Однако не стоит забывать, что модульность это тоже инкапсуляция). Использование инкапсуляции с достаточной гибкостью позволяет обеспечить механизм позднего связывания. Для использования механизма наследования в Delphi необходимо в объявлении класса справа от слова class указать класс предок:{ TAncestor = class private protected public procedure VirtualProcedure; virtual; abstract; procedure StaticProcedure; end; TDescendant = class(TAncestor) private protected public procedure VirtualProcedure; override; procedure StaticProcedure; end;}Абсолютно все классы в Delphi являются потомками класса TObject. Если класс-предок не указан, то подразумевается, что новый класс является прямым потомком класса TObject.
