Студопедия

КАТЕГОРИИ:

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

Листинг 5.4. Описание класса с перегружаемыми методами




Основные механизмы и положения объектно-ориентированного программирования

Объектно-ориентированное программирование является стандартом в технологии современного программирования и подавляющее большинство новейших средств разработки программных продуктов построены на основе ООП. Delphi не является исключением и обладает всеми необходимыми возможностями современного объектно-ориентированного языка программирования.

 

Инкапсуляция

 

5.1.1. Понятие класса и объекта

Классомназывается описание некоторой структуры программы, обладающей набором внутренних переменных — свойств,и функций (процедур), имеющих доступ к свойствам — методов.Процесс объединения переменных и методов, в результате которого и получается класс, называется инкапсуляцией.

Итак, класс — это всего лишь описание, аналогичное описанию типа данных и недоступное для прямого использования в программе. Для получения доступа к свойствам и методам класса (за исключением методов класса, описанных ниже) необходимо создать экземпляр класса,называемый также объектом.

Отметим различие в терминологии Turbo Pascal и Delphi. В Pascal объектом называлась структура, получаемая в результате инкапсуляции. В Delphi такие структуры называются классами, а объекты — это экземпляры классов.

5.1.2. Структура класса

 

Описание класса. Свойства и методы

 

Описание классов разделено на две части — интерфейсную («заголовочную») и описательную. В интерфейснойчасти располагается заголовок класса, в котором указываются название класса, идентифицирующее его в программе, а также описания свойств и заголовков методов. В описательнойчасти располагается программный код (реализация) методов, заголовки которых указаны в интерфейсной части описания класса.

Интерфейсная часть описания класса располагается в разделах описания типов данных модулей и основных частей программ. Выглядит она следующим образом:

Туре

…………………….

<Имя класса> = class   {Заголовок описания}

<Имя свойства 1>: <Тип свойства 1>;    {Описание свойства 1]

<Имя свойства N>: <Тип свойства N>;    {Описание свойства N}

 <Заголовок метода 1>; {Описание метода 1}

………………………

<Заголовок метода М>; {Описание метода М}

End;

 

Описательная часть класса находится в разделе описания локальных подпрограмм. Методы, заявленные в интерфейсной части реализуются по обычным правилам описания процедур и функций. Для связи подпрограмм с классом, методами которого они являются, название класса указывается перед именем самой подпрограммы:

Procedure  <Имя класса> . <Имя метода> (<Список параметров>);

или для методов-функций:

Function  <Имя класса> . <Имя метода> (<Список параметров>) : <Тип значения>;

Отличие методов от обычных процедур и функций состоит в том, что они могут обращаться к свойствам классов по имени без указания объектов. На этапе выполнения программы такие обращения будут перенаправлены к свойствам объектов, из которых вызываются соответствующие методы.

В листинге 5.1 приведен пример описания модуля, содержащего описание класса.

 

Листинг 5.1. Описания модуля, содержащего описание класса

Unit UsingClasses;

Interface

Type

Tсar = class                  {Заголовок класса содержит его название Tсar}

Mark: AnsiString;    

 {Описание текстового свойства Mark для хранения марки автомобиля }

EngineVolume: Double;  {Описание вещественного свойства

 для хранения объема двигателя}

Fuel: Double;          {Описание вещественного свойства

для хранения объема топлива}

Function StartEngine: Boolean;{Заголовок функции-метода

"Запустить двигатель"}

Procedure StopEngine;         {Заголовок процедуры-метода

    "Остановить двигатель"}

Procedure AddFuel(NewFuel: Double);

{Заголовок процедуры-метода

"Заправить топливом"}

 

 Implementation

Function TCar.StartEngine: Boolean;

Begin

Result := (Fuel>0);

 end;                                           {Описание метода StartEngine.

 В качестве результата возвращается

значение логического выражения (Fuel>0)}

Function TCar.StopEngine:

Begin

end;                                            {Описание метода StopEngine,

не выполняющего никаких действий}

Procedure AddFuel(NewFuel: Double);   {Описание метода AddFuel}

 Begin

 Fuel := Fuel + NewFuel;{Увеличение значения свойства

Fuel на величину, переданную

в качестве параметра NewFuel

при вызове метода}

 end;

End.                                            {Окончание модуля}

 

Обратим внимание на использование свойства Fuel в методе AddFuel. Метод AddFuel, который является частью описания класса TCar, обраща­ется к данному свойству по имени, хотя на этапе создания класса и неиз­вестно, какому именно экземпляру будет принадлежать изменяемое свойство. Однако точно известно, что каждый экземпляр обладает свойством Fuel, причем объект, из которого вызван метод AddFuel, также может быть определен системой. При вызове метода AddFuelH3 какого-либо экземп­ляра класса тсаг в качестве изменяемого свойства Fuel автоматически будет выбрано то, которое принадлежит этому же экземпляру.

Возможность такого абстрактного подхода к описанию классов без ука­зания их конкретных экземпляров и отличает объектно-ориентирован­ный подход к созданию программы от модульного, несмотря на их не­которое сходство.

 

Методы класса

 

Интересным нововведением в Delphi являются так называемые методы класса,особенность которых состоит в том, что для их вызова нет необходимости создавать объект (экземпляр класса), а можно использовать их как обычные подпрограммы. Для описания таких методов используется ключевое слово classперед заголовком метода:

Туре

       ………….

<Имя класса> =  class

………

class  <Заголовок метода>; {Описание метода класса}

End;

При реализации методов класса в описательной части класса ключевое слово class также указывается:

class <Имя класса>.<Заголовок метода>;

 

Методы класса применяются для создания библиотек специализированных методов, не требующих доступа к каким-либо данным, которые могут храниться в пределах объекта. В качестве примера приведем описание класса MthdClass, метод Get5  которого является методом класса (листинг 5.2).

 

Листинг 5.2. Пример описания методов класса

 

unit DeclaringClassMethods;

Interface

Type

MthdClass = class

class Function Get5: Double;

End;

Implementation

class Function Mthd.Class.Get5: Integer;

{Описание метода Get5 класса MthdClass}

 Begin

Result := 5;

 end;

End.

 

Для вызова метода класса необходимо указать название класса и название метода со списком необходимых параметров. Название класса и его метода разделяются точкой:

<Класс>.<Метод>(<Список параметров>) ;

 Использование метода класса отражено в следующем листинге 5.3.

 

Листинг 5.3. Использование метода класса

unit UsingClassMethods;

Uses DeclaringClassMethods;

{Подключаем модуль DeclaringClassMethods,

в котором описан класс MthdClass}

 Interface

 Implementation

Procedure UsingClass;   {Описание процедуры UsingClass}

 Var

A: Integer;  {Описание целочисленной переменной А}

Begin

 A := MthdClass.Get5; {Вызов метода класса по имени класса

и метода, в переменную А заносится

значение 5}

end;

End.

 

Отметим, что методы класса иногда называют статическими методами.

 

Перегружаемые методы

 

Перегружаемые методы аналогичны перегружаемым процедурам и имеют такой же механизм работы. Пример, возможного описания класса с перегружаемыми методами приведен в листинге 5.4.

Листинг 5.4. Описание класса с перегружаемыми методами

Туре

AClass = class

 Function Mult(A, B: Integer): Integer; overload;

{Заголовок метода Mult с двумя целочисленными параметрами, возвращающий целочисленное значение}

 Function Mult(A, В: Double): Double; overload;

{Заголовок метода Mult с двумя вещественными параметрами, возвращающий вещественное значение}

end;

Function AClass.Mult(A, B: Integer): Integer;

Begin

Result   := A  * B;

end;               {Описание первого варианта метода Mult}

Function AClass.Mult(A, B: Double): Double;

Begin

Result   : = A  * B;

end;                {Описание второго варианта метода Mult}

 

Области видимости элементов класса

 

Для разграничения доступа к свойствам и методам экземпляров классов между различными частями программы предусмотрены модификаторы доступа («видимости»), приведенные в табл. 5.1.

 

Модификатор доступа в Delphi (как и в Pascal, но в отличие от некото­рых других языков программирования) относится не к конкретному свой­ству или методу класса, а ко всем элементам класса (свойствам и методам), описание которых располагается после указания модификатора. Один и тот же модификатор может указываться в описании класса более одного раза.

Сравнительная таблица модификаторов доступа в Pascal и Delphi               Таблица 5.1

Модификатор

Область видимости свойства или метода, помеченного модификатором

    Pascal Delphi
Private описание класса и модуль, в котором описан класс, в том числе и для других классов также
Protected не используется как у private + в классах, унаследованных от этого класса
Public любая часть программы так же
Published не используется как у public + в Инспекторе объектов Delphi для визуального построения программ

 

Стандартное описание класса содержит свойства и методы, расположенные в порядке возрастания их видимости, но это правило не является обязательным.

Туре

           ……………………..

<Имя класса> = class

Private

<Имя свойства 1>: <Тип свойства 1>;

{Описание свойств класса, имеющих область видимости private}

………………..

<Имя свойства N>: <Тип свойства N>;

<Заголовок метода 1>;

{Описание методов класса, имеющих область видимости private}

<3аголовок метода М>;

Protected

<Имя свойства 1>: <Тип свойства 1>;

{Описание свойств класса, имеющих область видимости protected}

………………..

<Имя свойства N>: <Тип свойства N>;

<Заголовок метода 1>;

{Описание методов класса, имеющих область видимости protected}

………………..

<Заголовок метода М>;

 public

<Имя свойства 1>: <Тип свойства 1>;

{Описание свойств класса, имеющих-область видимости public}

………………..

<Имя свойства N>: <Тип свойства N>;

<Заголовок метода 1>;

{Описание методов класса, имеющих область видимости public}

………………..

<Заголовок метода М>;

Published

......... 

                 {Описание специальных свойств

класса (property), имеющих область видимости published}

End;

Различные области видимости свойств и методов объекта предназначены для упрощения поддержания целостности информации в объектах. Рассмотрим класс, в котором содержатся три свойства — а, b и с, причем с является произведением а и b. Если свойства а, b и с будут иметь широкую область видимости public, то есть будут доступны из любого фрагмента программы, то объект — экземпляр такого класса может содержать некорректные данные, так как существует возможность изменения свойств а и b без пересчета свойства с. Для выхода из такой ситуации можно предложить два подхода, и оба они связаны с использованием областей видимости свойств объекта.

Первый подход (см. листинг 5.5) состоит в том, чтобы скрыть свойства а и b от вызывающих подпрограмм, назначив им узкие области видимости, например private или protected. Выбор того или иного модификатора определяется необходимостью использования скрываемых свойств в классах-потомках данного класса. Если такой необходимости нет, то назначается область видимости private, если объекты-потомки должны иметь прямой доступ к свойствам, то назначается область видимости protected.

В любом случае, внешние подпрограммы не смогут обратиться к свойствам а и b, поэтому придется предусмотреть методы, которые их устанавливают. В этих методах, помимо установки значений свойств, должен производиться пересчет свойства с. Это будет гарантировать целостность данных объекта при изменении свойств а и b.

Заметим, что методы установки должны иметь широкую область видимости, чтобы к ним можно было обратиться из любого места программы.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 205.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...