Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Объектно-ориентированное программирование. Классы. Объекты

Исторически сложилось так, что программирование возникло и развивалось как процедурное (структурное) программирование. Процедурное программирование предполагает, что основой программы является алгоритм, процедура обработки данных.Объектно-ориентированное программирование (ООП) представляет собой новый этап развития современных концепций построения языков программирования. Многие понятия объектно-ориентированного программирования выглядят достаточно непривычно для программистов не сталкивавшихся с ними ранее.В основе ООП лежит понятие объекта, сочетающего в себе данные и действия над ними.В настоящее время объектно-ориентированная технология программирования получила широкое распространения. Существуют языки программирования, для которых ООП является методологической основой, - так называемые чистые объектно-ориентированные языки. Кроме того, к настоящему времени многие распространённые языки, первоначально рассчитанные на традиционный подход к программированию, содержат ряд объектно-ориентированных расширений.В язык программирования Turbo Pascal объектно-ориентированное расширение было внедрено фирмой Borland начиная с версии 5.5. Объектовые типы. Классы. Для использования объектов в разделе объявления типов необходимо объявить объектовый тип, который в объектно-ориентированной терминологии чаще называют классом. С формальной точки зрения, объектовые типы (классы) в языке Turbo Pascal очень похожи на комбинированные типы (записи). Объектовые типы (классы) также являются составными типами, элементы (поля) которых могут иметь любой тип. Так, простейший пример объектового типа выглядит следущим образом: Type Point = object X, Y: integer; Visible: boolean; end; Здесь для формирования структуры используется служебное слово object, а содержимым объектового типа являтся два поля целого типа и одно - булевого типа. (Назначением такой структуры может быть хранение информации о положении некоторой точки на экране дисплея и о видимости этой точки). Объекты-переменные (объекты) В дальнейшем введённый таким образом тип Point (или любой другой класс) можно использовать в программе обычным образом: определять переменные этого типа (как статически - посредством описателя var, - так и динамически, создавая экземпляр переменной этого типа с помощю стандартной процедуры New), работать с полями и т.д. Методы объекта Важнейшим и радикальным отличием от обычных комбинированных типов является возможность, наряду с полями, задавать в объектовом типе подпрограммы - процедуры и функции. В этом и заключается одна из основных идей объектно-ориентированного подхода к программированию: предполагается, что объект содержит не только информацию (в предыдущем примере - координаты точки и признак её " видимости"), но и правила работы с этой информацией, оформленные в виде выполняемых фрагментов.Такими правилами могут быть, например, операция создания точки (установка значений координат), а также операции " включения" и " выключения" точки и перемещения её в другое место экрана. Подпрограммы, определённые в объектовом типе, называются методами объекта (methods).Технически определение подпрограмм в объектовых типах делается так: непосредственно в объектовом типе задаются только заголовки подпрограмм-методов, а полные их описания должны быть заданы отдельно, причём имя подпрограммы-метода формируется из имени объектового типа " хозяина", символа " точка" и имени подпрограммы, например: Type Point = object {объектовый тип, класс " точка" } X, Y: integer; {поле координаты} Visible: boolean; {поле видимость} procedure Create (a, b: integer); {метод определение координат} procedure SwithOn; {метод вкл. видимость} procedure SwithOff; {метод выкл. видимость} procedure Move (dx, dy: integer); {метод переместить} function GetX: integer; {метод вернуть координату x} function GetY: integer; {метод вернуть координату y} end; procedure Point.Create (a, b: integer); begin X: =a; Y: =b; Visible: = false; end; Procedure Point.SwithOn; begin Visible: = true; PutPixel(X, Y, Getcolor); end;... Такое разделение диктуется, во-первых, необходимостью достижения большей наглядности определения объектового типа; во-вторых, становится возможным определение таких типов как интерфейсных элементов модуля. В этом случае полные описания подпрограмм-методов могут быть размещены в разделе реализации модуля. Несмотря на выделение методов из определения объектового типа, в телах методов считаются доступными идентификаторы полей этого объектового типа (заметим, что методы объекта должны быть заданы ПОСЛЕ указания всех его полей). Таким образом, объединение в одном понятии информации о некотором реальном объекте-прототипе (в примере - точки на экране дисплея) и операций над ним делает объектовый тип замкнутой самодостаточной сущностью, содержащей все требуемые знания о конкретном элементе прикладной области. Имея вышеприведённое описание, можно определять в программе экземпляры объектов, например: var OnePoint: Point; и в дальнейшем оперировать с этим экземпляром посредством его методов: OnePoint.Create(100, 200); OnePoint.SwithOn; OnePoint.Move(20, -10); Оператор присоединения with --------------------------- Для объектовых типов так же, как и для записей, допускается использование оператора присоединения. with OnePoint dobegin Create(100, 200); SwithOn; Move(20, -10); end; Создавая программу с использованием объектно-ориентированных понятий, программист может конструировать её не в виде бессистемной совокупности отдельно заданных данных и подпрограмм, а как коллектив независимых объектов с полностью определённым поведением. Некоторые особенности использования ООП. Как уже было сказано, методы, определённые в объектовом типе, имеют доступ ко всем полям этого типа. Помимо этого, можно обращаться к полям непосредственно, используя обычную точечную нотацию (обращение, как к полям записи). Однако это считается отступлением от объектно-ориентированного стиля, согласно которому все действия с информацией, заданной в объектовом типе, осуществляются посредством только его методов. Инкапсуляция Объединение в одном объекте данных (параметров) и их методов (действий над ними), в объектно-ориентированном программировании называется инкапсуляцией. Инкапсуляция - первое основное свойство объекта. Пример ------ В качестве примера рассмотрим программу, в которой применяется описанный выше класс Point. Светящаяся точка перемещается по экрану с помощью клавиш со стрелками. Клавишей F1 включается и выключается её видимость. PROGRAM EX_35_1; USES Crt, Graph; TYPE Point = object {объектовый тип, класс " точка" } X, Y: integer; {координаты} Visible: boolean; {видимость} procedure Create (a, b: integer); {определение координат} procedure SwithOn; {вкл. видимость} procedure SwithOff; {выкл. видимость} procedure Move (dx, dy: integer); {переместить} function GetX: integer; {вернуть координату x} function GetY: integer; {вернуть координату y} function GetV: boolean; {вернуть видимость} end; procedure Point.Create (a, b: integer); begin X: =a; Y: =b; Visible: = false; end; Procedure Point.SwithOn; begin Visible: = true; PutPixel(X, Y, GetColor); end; Procedure Point.SwithOff; begin Visible: = false; PutPixel(X, Y, GetBkColor); end; Procedure Point.Move (dx, dy: integer); var a, b: integer; begin a: =x+dx; b: =y+dy; if visible then putpixel(x, y, GetBkColor); if a> 639 then x: =639 else if a< 0 then x: =0 else x: =a; if b> 479 then y: =479 else if b< 0 then y: =0 else y: =b; if visible then putpixel(x, y, GetColor); end; function Point.GetX: integer; begin GetX: =X; end; function Point.GetY: integer; begin GetY: =Y; end; function Point.GetV: boolean; begin GetV: =Visible; end; VAR Gd, Gm: integer; ch: char; Pt: Point; BEGIN Gd: =Vga; Gm: =VgaHi; InitGraph(Gd, Gm, ''); If GraphResult=GrOk then Begin Pt.Create(320, 240); Pt.SwithOn; Repeat ch: = readkey; if ch=#0 then begin ch: = readkey; case ch of{вверх} #72: Pt.Move(0, -1); {вниз} #80: Pt.Move(0, 1); {влево} #75: Pt.Move(-1, 0); {вправо} #77: Pt.Move(1, 0); {F1} #59: if Pt.GetV then Pt.SwithOff else Pt.SwithOn; end; {case} end; Until ch=#13; End; Closegraph; END. Контрольные вопросы. 1. Что называют объектовым типом (классом)? 2. Что называют объектом? 3. Что такое инкапсуляция? 4. Как объявляются объектовые типы (классы) в Turbo Pascal? 5. Что называют методами объекта? Наследование Следующее важное свойство объектовых типов позволяет при построении нового объектового типа использовать некоторый ранее определённый объектовый тип. Пусть, например, необходимо построить объектовый тип, управляющий простой геометрической фигурой - кругом - на экране дисплея. Ясно, что структура информация для определения круга очень похожа на описанную в предыдущем разделе структуру для точки: здесь также необходимы поля X и Y для фиксации центра круга в текущий момент. Нужно ещё добавить поле для хранения величины радиуса круга. Традиционный стиль программирования допускает два решения. Во-первых, можно ввести для круга совершенно новую структуру, повторив в ней (может быть, под другими именами) те же поля X, Y и Visible и добавив новое поле Radius. Во-вторых, можно скоструировать структуру для круга, использовав в ней поле с типом, ранее определённым для точки (сделать " структуру в структуре"). Оба подхода вполне приемлемы, однако объектно-ориентированное программирование предполагает иной подход, который по ряду причин является гораздо более предпочтительным. Объектно-ориентированный стиль позволяет определить новый объект как потомок другого ранее определённого типа. Это означает, что новый тип автоматически получает все поля и методы ранее введённого типа, который в этом случае называется предком или родительским типом. В этом случае в определении типа-потомка должно быть указано (в круглых скобках после служебного слова object) имя родительского типа: Circle = object (Point) Radius: integer; end; Задание родительского типа означает, что в объектовом типе Circle неявно присутствуют все поля из типа Point; аналогично, для переменной нового типа доступны все методы из Point: var OneCircle: Circle; begin OneCircle.Init(100, 200); OneCircle.Radius: = 30;... Описанное свойство наследования характеристик одного объекта другим называется наследованием является одним из основных свойств ООП и широко используется в объектно-ориентированном программировании. Один тип может являться предком для произвольного числа типов-потомков, в то время как любой объектовый тип может наследовать поля и методы только одного типа-родителя, который указывается в круглых скобках. Тип потомок может, в свою очередь, выступать как предок по отно шению к другому объектовому типу (типам). Так, можно определить фигуру " кольцо", состоящую из двух концентрических кругов: type Ring = object (Circle) Radius2: integer; end; Полиморфизм Тип Ring наследует поле Radius из своего непосредственного родителя Circle, а также поля и методы из типа Point, который также считается (косвенным) предком для Ring. Длина такой цепочки наследования в языке никак не ограничивается. По правилу наследования тип Circle имеет в своём составе методы объекта-предка Point. Однако, легко видеть, что методы SwithOn, SwithOff не подходят для рисования круга. Поэтому, полное описание типа Circle должно содержать также собственные методы для рисования и удаления круга и его передвижения по экрану. Самым простым решением было бы ввести в новый тип такие методы, дав им некоторые новые имена. Но объектно-ориентированный подход позволяет определить новые методы СО СТАРЫМИ именами, ПЕРЕОПРЕДЕЛИВ тем самым методы типа-родителя. Сразу отметим, что переопределять можно только методы; поля, указанные в родительском типе, безусловно наследуются типом-потомком и не могут быть в нём переопределены (то есть имена полей потомка не должны совпадать с именами полей типа-предка). Кроме того, новый метод в типе потомке может иметь совершенно другие параметры. нежели одноимённый метод из типа-предка. Возможность иметь в одной программе несколько подпрограмм-методов для разных объектов называется в ООП полиморфизмом, и является одним из основных свойств ООП. Компилятор, не обнаружив вызываемого метода, просматривает определение родительского типа; если данный метод и здесь не определён, то аналогично просматривается родитель родителя и т.д. Если очередной объектовый тип не имеет предка, а метод не обнаружен, то компилятор фиксирует ошибку. Механизм наследования, являясь достаточно простым для понимания и использования, предоставляет широкие возможности при разработке прог рамм. Имея несколько " базовых" объектовых типов (например, в интерфейсном разделе модуля), можно на их основе конструировать новые объекты, добавляя в них новые поля и расширяя и/или переопределяя соответствующие методы. Правило совместимости типов по присваиванию, действующее для случая объектовых типов, формулируется достаточно просто: совместимыми по присваиванию являются, кроме эквивалентных типов (то есть объявленных в виде T1=T2), объектовые типы, состоящие в отношении наследования, причём присваивание может происходить в направлении ОТ типа-потомка К родительскому типу, НО НЕ НАОБОРОТ. В подобных случаях копируются (присваиваются) только те поля, которые являются общими для обоих типов. Такое же правило действует и для указателей на объектовые типы. Контрольные вопросы. 1. Какое свойство ООП называют наследованием? 2. Какое свойство ООП называют полиморфизмом? 3. Объясните понятия объект-предок и объект-потомок.4. Можно ли переопределять поля объекта-предка?
<== предыдущаЯ лекциЯ | следующаЯ лекциЯ ==>
Особенности строения твердых тел | 

Данная страница нарушает авторские права?





© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.