- •1. Новые концепции ооп в языке Oblect Pascal
- •2. Объектно-ориентированный подход в программировании
- •Основные понятия
- •3. Понятие класса и объекта
- •4. Поля, методы и свойства объекта
- •5. Ключевое слово Self, примеры использования
- •6. Перегруженные методы
- •7. Создание и удаление объектов
- •8. Инкапсуляция
- •9. Инкапсуляция и модули
- •10. Директивы видимости
- •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. События стандартных визуальных компонент и их использование
8. Инкапсуляция
Инкапсуляция, наследование и полиморфизм являются тремя столпами объектно-ориентированного программирования, реализуя в нём принцип абстракции данных. В объектно-ориентированных языках инкапсуляция, как правило, реализуется посредством механизма классов. Некоторые исследователи классифицируют инкапсуляцию как понятие, присущее исключительно объектно-ориентированному программированию, и необходимое для управления сокрытием, но существуют и другие механизмы, рассматривающие эти понятия независимо. Например, применение средств инкапсуляции для многих задач оказывается ненужным в языках, использующих лексическую область видимости, которая обеспечивает полное сокрытие компонентов.
В общем случае, в разных языках программирования термин «инкапсуляция» относится к одной из или обеим одновременно следующим нотациям:
языковая конструкция, позволяющая связать данные с методами, предназначенными для обработки этих данных;
механизм языка, позволяющий ограничить доступ одних компонентов программы к другим.
В Delphi для создания скрытых полей или методов их достаточно объявить в секции private.
TMyClass = class
private
FMyField: Integer;
procedure SetMyField(const Value: Integer);
function GetMyField: Integer;
public
property MyField: Integer read GetMyField write SetMyField;
end;
Для создания интерфейса доступа к скрытым полям в Delphi введены свойства.
9. Инкапсуляция и модули
Object Pascal позволяет использовать инкапсуляцию основанную на модулях.
Внешние по отношению к данному модулю программы могут использовать всё, что объявлено в интерфейсной части модуля, при этом они не имеют доступа к внутренней реализации используемых процедур и функций. Т.е. детали реализации, инкапсулированы внутри модуля, что также способствует разделению труда между программистами и позволяет легко вносить изменения в реализацию процедур и функций.
1 модуль
TDate = class //(TObject)
private
FDate: TDateTime;
procedure SetMonth (const Value: integer);
procedure SetDay (const Value: integer);
procedure SetYear (const Value: integer);
function GetMonth: integer;
function GetDay: integer;
function GetYear: integer;
2 модуль
TForm2 = class(TForm)
var
Form2: TForm2;
ADate: Tdate;
procedure TForm2.Button1Click(Sender: TObject);
begin
ADate.Year:=StrToInt(Edit1.Text);
ADate.Month:=StrToInt(Edit2.Text);
ADate.Day:=StrToInt(Edit3.Text);
end;
10. Директивы видимости
Для поддержки инкапсуляции основанной на классах в 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;
…………….
End;
Procedure TDate.SetValue(m,d,y:integer);
Begin
Fdate:=EncodeDate(y,m,d);
End;
В данном примере метод GetText возвращает дату в виде строки. Добавление функиций типа Getmonth getyear getday не целесообразно, так как функции реализующие прямой доступ ко всем полям подряд могут уменьшить эффект от инкапсуляции, усложнив изменение внутренней структуры класса(при необходимости);
Изменим внутреннюю структуру класса. Вместо полей введем новое поле типа TdateTime. При внесении данного изменения интерфейс класса никоим образом не изменится. -> не изменится и код прикладных программ, использующих данный класс.
