
- •Технология программирования
- •Технология программирования
- •Оглавление
- •§1. Классификация и эволюция программного обеспечения
- •§2. Модульное и объектно-ориентированное программирование
- •Основные понятия ооп
- •Составные части объектного подхода
- •Инкапсуляция. Свойства
- •Наследование. Методы
- •Полиморфизм
- •§3. Визуальная среда программирования Структура проекта Delphi
- •Библиотека компонентов Delphi
- •Класс tButton (кнопки)
- •Класс tShape (фигуры)
- •§4. Основные типы данных в языке Паскаль
- •Класс tLabel (надписи)
- •Класс tEdit
- •Класс tMemo
- •Класс tMainMenu
- •Стандартные диалоги
- •Классы tOpenDialog и tSaveDialog
- •Класс tFontDialog
- •Инструкция case
- •§6. Программирование циклических алгоритмов
- •Цикл с параметром. Инструкция for
- •Цикл с предусловием. Инструкция while
- •Цикл с постусловием. Инструкция repeat … until
- •§7. Простейшие вычислительные методы
- •Метод прямоугольников
- •Метод Монте-Карло
- •Метод деления пополам
- •§8. Процедуры и функции
- •§9. Одномерные массивы
- •Класс tListBox
- •Класс tComboBox
- •§10. Двумерные и многомерные массивы
- •Класс tStringGrid
- •Алгоритмы поиска наименьшего и наибольшего элемента
- •§11. Алгоритмы поиска и сортировки. Понятие вычислительной сложности алгоритма
- •Алгоритм простого перебора
- •Алгоритм бинарного поиска
- •Алгоритм сортировки методом «пузырька»
- •Алгоритм сортировки включением
- •Понятие вычислительной сложности алгоритма
- •§12. Обработка исключительных ситуаций
- •§13. Программирование процессов реального времени
- •Класс tTimer
- •§14. Графическая подсистема Delphi Класс tImage
- •Класс tCanvas
- •§15. Динамическое создание компонентов. Конструкторы и деструкторы
- •§16. Тестирование и отладка программ
- •Методы тестирования программ
- •Средства отладки программ в Delphi
- •Трассировка программы
- •Точки останова программы
- •Наблюдение значений переменных
- •§17. Жизненный цикл программного обеспечения
- •Последовательный (каскадный) тип
- •Эволюционный (спиральный) тип
- •Библиографический список
- •Технология программирования
- •Редактор с.В.Пилюгина
- •620034, Екатеринбург, ул. Колмогорова, 66, УрГупс Редакционно-издательский отдел
Составные части объектного подхода
Ранее мы ввели ряд новых понятий, которыми будем пользоваться в дальнейшем. Теперь поговорим о принципах, составляющих суть объектно-ориентированного программирования. Таких принципов три - инкапсуляция, наследование и полиморфизм.
Инкапсуляция. Свойства
Классическое правило объектно-ориентированного программирования утверждает, что для обеспечения надежности нежелателен прямой доступ к полям объекта: чтение и обновление их содержимого должно производиться посредством вызова соответствующих методов. Это правило и называется инкапсуляцией. До сих пор эта мысль внедрялась только посредством призывов и примеров, в языке же Object Pascal появилась соответствующая конструкция. В объектах Delphi пользователь объекта может быть полностью отгорожен от полей при помощи свойств.
Обычно свойство определяется тремя элементами: полем и двумя методами, которые осуществляют его чтение/запись:
type
TAnObject = class(TObject)
function GetAProperty: TSomeType;
procedure SetAProperty(ANewValue: TSomeType);
property AProperty: TSomeType read GetAProperty write SetAProperty;
end;
В данном примере доступ к значению свойства AProperty осуществляется через вызовы методов GetAProperty и SetAProperty. Однако в обращении к этим методам в явном виде нет необходимости: достаточно написать
AnObject.AProperty : = AValue;
AVariable := AnObject.AProperty;
и компилятор оттранслирует операторы в вызовы методов, т. е. внешне свойство выглядит в точности как обычное поле, но за всяким обращением к нему могут стоять нужные вам действия. Например, если у вас есть объект, представляющий собой квадрат на экране, и вы его свойству «цвет» присваиваете значение «белый», то произойдет немедленная перерисовка, приводящая реальный цвет на экране в соответствие значению свойства.
Свойство может быть и векторным; в этом случае для программиста оно выглядит как массив:
Property APoints[Index: Integer] rTPoint read GetPoint write SetPoint;
О роли свойств в Delphi красноречиво говорит следующий факт: у всех имеющихся в вашем распоряжении стандартных классов 100% полей недоступны и заменены базирующимися на них свойствами. Рекомендуем при разработке своих классов придерживаться этого же правила.
Наследование. Методы
Вторым «столпом» ООП является наследование. Этот простой принцип означает, что если вы хотите создать новый класс, лишь немного отличающийся от старого, то совершенно нет необходимости в переписывании заново уже существующих полей и методов. Вы объявляете, что новый класс
TNewObject = class(TOldObject);
является потомком или дочерним классом старого класса, называемого предком или родительским классом, и добавляете к нему новые поля, методы и свойства - иными словами, то, что нужно при переходе от общего к частному.
В Object Pascal все классы являются потомками класса TObject. Поэтому, если вы строите дочерний класс прямо от TObject, то в определении его можно не упоминать. Следующие два выражения одинаково верны:
TMyObject = class(TObject);
TMyObject = class;
Унаследованные от предка поля и методы доступны в дочернем классе; если имеет место совпадение имен методов, то говорят, что они перекрываются.
Рассмотрим поведение методов при наследовании, что, без преувеличения, является краеугольным камнем объектно-ориентированного программирования. По тому, какие действия происходят при вызове, методы делятся на три группы: статические (static), виртуальные (virtual) и динамические (dynamic).
Статические методы, а также поля в объектах-потомках ведут себя одинаково: вы можете без ограничений перекрывать старые имена и при этом изменять тип методов.
В отличие от поля, внутри других методов перекрытый метод доступен при указании зарезервированного слова inherited. Методы объектов по умолчанию являются статическими - их адрес определяется еще на стадии компиляции проекта. Они вызываются быстрее всех.
Принципиально отличаются от статических виртуальные и динамические методы. Они могут быть так объявлены путем добавления соответствующей директивы virtual или dynamic.