Цель: Познакомить учащихся с основами ООП. План урока: 1. Теоретическая часть 2. Практическая часть, разработка класса для расчета периметра, и площади треугольника. 3. Контрольные вопросы, домашнее задание (разработка класса для расчета площади прямоугольного треугольника) Оборудование: ПК со средой разработки Lazarus(Delphi). Здравствуйте, сегодня я познакомлю вас с объектно-ориентированным программированием (ООП). Объекты — это крупнейшее достижение в современной технологии программирования. Они позволили строить программу не из чудовищных по сложности процедур и функций, а из кирпичиков-объектов, заранее наделенных нужными свойствами. Самое приятное в объектах то, что их внутренняя сложность скрыта от программиста, который просто пользуется готовым строительным материалом. Три кита ООП Весь мир ООП держится на трех китах: инкапсуляции, наследовании и полиморфизме. Для начала о них надо иметь только самое общее представление. Объединение данных и операций в одну сущность — объект — тесно связано с понятием инкапсуляции, которое означает сокрытие внутреннего устройства. Инкапсуляция делает объекты похожими на маленькие программные модули, в которых скрыты внутренние данные и у которых имеется интерфейс использования в виде подпрограмм. Переход от понятий "структура данных" и "алгоритм" к понятию "объект" значительно повысил ясность и надежность программ. Второй кит ООП — наследование. Этот простой принцип означает, что если вы хотите создать новый класс объектов, который расширяет возможности уже существующего класса, то нет необходимости в переписывании заново всех полей, методов и свойств. Вы объявляете, что новый класс является потомком (или дочерним классом) имеющегося класса объектов, называемого предком (или родительским классом), и добавляете к нему новые поля, методы и свойства. Процесс порождения новых классов на основе других классов называется наследованием. Новые классы объектов имеют как унаследованные признаки, так и, возможно, новые. Например, класс СОБАКИ унаследовал многие свойства своих предков — ВОЛКОВ. Третий кит — это полиморфизм. Он означает, что в производных классах вы можете изменять работу уже существующих в базовом классе методов. При этом весь программный код, управляющий объектами родительского класса, пригоден для управления объектами дочернего класса без всякой модификации. Например, вы можете породить новый класс кнопок с рельефной надписью, переопределив метод рисования кнопки. Новую кнопку можно "подсунуть" вместо стандартной в какую-нибудь подпрограмму, вызывающую рисование кнопки. При этом подпрограмма "думает", что работает со стандартной кнопкой, но на самом деле кнопка принадлежит производному классу кнопок и отображается в новом стиле. Пока достаточно самого поверхностного понимания всех приведенных выше понятий, ниже мы рассмотрим их подробнее и покажем, как они реализованы в среде разработки Lazarus. Все присущие объекту характеристики в терминах ООП называют полями. По сути, это принадлежащие объекту переменные определённого типа, в которые записываются значения, отражающие состояние объекта. Для управления объектом предназначены его методы. В первую очередь методы воздействуют на поля объекта. Если методы объекта возвращают какое-нибудь значение, то они реализуются в виде функций, в противном случае метод представляется процедурой. Объект не может возникнуть из воздуха, среда программирования каким-то образом должна быть проинформирована о его характеристиках. Поэтому предварительно программист описывает объект; такое описание называется классом. Классы объектов определяются в секции type глобального блока. Описание класса начинается с ключевого слова class и заканчивается ключевым словом end. По форме объявления классы похожи на обычные записи, но помимо полей данных могут содержать объявления пользовательских процедур и функций. Такие процедуры и функции обобщенно называют методами, они предназначены для выполнения над объектами различных операций. Приведем пример объявления класса, который предназначен для расчета периметра и площади квадрата. type TQuadro = class // Поля Storona: integer; // Методы function Perimeter:Integer; function Square: Integer; end; Ставим перед function курсор, нажимаем Ctrl+Shift+C, получаем заготовку будущих функций. function TQuadro.Perimeter: Integer; begin end; function TQuadro.Square: Integer; begin end; Учащиеся заполняют эти заготовки самостоятельно. Заполненный вариант выглядит примерно вот так function TQuadro.Perimeter: Integer; begin Result:=0; // Обнуляем результат функции Result:=4*storona; end; function TQuadro.Square: Integer; begin Result:=0; Result:=sqr(storona); end; На этом, затоговка для класса Tquadro готова. Чтобы от описания класса перейти к объекту, следует выполнить соответствующее объявление в секции var: var Q: TQuadro; При работе с обычными типами данных этого объявления было бы достаточно для получения экземпляра типа. Однако объекты являются динамическими данными, т.е. распределяются в динамической памяти. Поэтому переменная Q — это просто ссылка на экземпляр (объект в памяти), которого физически еще не существует. Чтобы сконструировать объект (выделить память для экземпляра) класса TQuadro и связать с ним переменную Q, нужно в тексте программы поместить следующий оператор: q:=TQuadro.Create; Create — это так называемый конструктор объекта; он всегда присутствует в классе и служит для создания и инициализации экземпляров. При создании объекта в памяти выделяется место только для его полей. Методы, как и обычные процедуры и функции, помещаются в область кода программы; они умеют работать с любыми экземплярами своего класса и не дублируются в памяти. После создания объект можно использовать в программе: получать и устанавливать значения его полей, вызывать его методы. Доступ к полям и методам объекта происходит с помощью уточненных имен, например q.Storona:=9; Бросаем на форму Button1, и дважды кликаем на нее. В обработчике пишем: procedure TForm1.Button1Click(Sender: TObject); Var Q:TQuadro; // Объявляем экземпляр Q класса TQuadro begin q:=TQuadro.Create; //Выделение памяти под созданный экземпляр объекта q.Storona:=9; //Сторона квадрата равна 9. showmessage('Периметр квадрата='+inttostr(Q.Perimeter)); showmessage('Площадь квадрата='+inttostr(Q.Square)); q.destroy; //Уничтожение созданного экземпляра объекта и освобождение памяти end; Если объект становится ненужным, он должен быть удален вызовом специального метода Destroy, например: Q.Destroy; Destroy — это так называемый деструктор объекта; он присутствует в классе наряду с конструктором и служит для удаления объекта из динамической памяти. После вызова деструктора переменная Reader становится несвязанной и не должна использоваться для доступа к полям и методам уже несуществующего объекта. Чтобы отличать в программе связанные объектные переменные от несвязанных, последние следует инициализировать значением nil. Например, в следующем фрагменте обращение к деструктору Destroy выполняется только в том случае, если объект реально существует: Reader := nil; ... if Reader <> nil then Reader.Destroy; Вызов деструктора для несуществующих объектов недопустим и при выполнении программы приведет к ошибке. Чтобы избавить программистов от лишних ошибок, в объекты ввели предопределенный метод Free, который следует вызывать вместо деструктора. Метод Free сам вызывает деструктор Destroy, но только в том случае, если значение объектной переменной не равно nil. Поэтому последнюю строчку в приведенном выше примере можно переписать следующим образом. Reader.Free; В завершении урока отмечу, что ООП довольно интересная и увлекательная тема, и охватить ее в рамках одного урока не является возможным. Контрольные вопросы: 1. Назовите три кита ООП. 2. С чего начинается описание класса? 3. Что такое конструктор объекта? 4. Что такое деструктор объекта? 5. Чем отличается метод Free от деструктора Destroy? Домашнее задание. Написать свой класс для вычисления площади прямоугольного треугольника.
Источник: http://delphisources.ru, http://delphikingdom.com |