<<
>>

Лекция 3.2. Основные концепции ООП. Поля и свойства

ООП базируется на трех основных принципах:

· инкапсуляция;

· наследование;

· полиморфизм.

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

Инкапсуляция - это комбинирование данных и методов, которые манипулируют этими данными.

Само по себе понятие класса подразумевает инкапсуляцию. Инкапсуляция позволяет обеспечить защиту данных от внешнего вмешательства или неправильного использования. Степень закрытости данных регулируется областями видимости (Public, Private, Protected…). Обычно открытые члены класса используются для того, чтобы обеспечить контролируемый интерфейс с его закрытой частью.

Наследование

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

Например, на основе класса, описывающего объект «окружность», можно создать класс, описывающий объект «кольцо». Причем часть свойств и методов у этих объектов будут общими (унаследованными): координаты центра, радиус внешней окружности, метод расчета длины внешней окружности. Поэтому при объявлении класса «кольцо» не нужно заново описывать эти свойства и методы, требуется определить только то, что отличает дочерний класс от родительского:

TRing = class (TCircle) // объявляем класс TRing на основе TCircle

private

FR2: Real; // радиус внутренней окружности

public

function Area: Real; // заголовок метода определения

// площади кольца

function Circumference2: Real; // заголовок метода определения

// внутреннего периметра

function Inside(X, Y: Real): Boolean; // заголовок метода определения

//вхождения точки в кольцо

end;

implementation // раздел реализации

function TCircle.

Area: Real; // метода Area класса TRing

begin

Result:= inherited Area - Pi * FR2 * FR2; // расчет площади кольца

end;

Обратите внимание на директиву Inherited, которая позволяет вызвать метод предка. В данном примере, выполнив inherited Area, мы получили площадь внешней окружности, при этом отпала необходимость повторять реализацию метода предка.

Полиморфизм

В значительной степени мощь объектно-ориентированного программирования проистекает из применения различных форм полиморфизма. Слово полиморфизм греческого происхождения и означает приблизительно «много форм».

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

Например, выше мы рассмотрели пример класса TCircle и дочернего от него класса TRing. Согласно правилу соответствия типов, переменные дочернего класса всегда совместимы с переменными класса-предка, причем совместимость односторонняя: переменной класса-предка можно присвоить значение переменной дочернего класса, но не наоборот. Например, есть объявленная переменная класса TCircle, которой присваивается фактический параметр класса TRing, оба класса имеют методы с одинаковым названием, но разной реализацией. Концепция полиморфизма подразумевает, что будут вызываться методы, соответствующие не типу объявленной переменной, а типу реально записанной в нее переменной. (см. пример «методы виртуальные и динамические»)

Поля и свойства

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

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

Поля

Поля класса представляют собой обычные переменные, объявленные внутри класса. Основное назначение полей – хранение состояний объекта. Фактически поля класса аналогичны полям записи. Объявление полей класса должно предшествовать объявлению методов и свойств. Пример с объявлением полей был рассмотрен ранее при описании класса TCircle. В примере были использованы поля FX, FY и FR. По неформальному соглашению буква F (Field) перед именем переменной обозначает, что переменная является полем.

Свойства

Прямое обращение к полям, определяющим состояние объекта, крайне нежелательно и противоречит концепциям ООП. Свойства позволяют реализовать скрытый механизм использования методов для доступа к полям. При присвоении значения свойству, вызывается метод записи (write), а при чтении значения свойства – метод чтения (read), причем внешне это выглядит как обращение к переменной.

Для объявления свойств используется служебное слово property, затем указывается имя свойства и его тип (совпадающий с типом соответствующего поля), а также методы чтения (read) и записи (write). Пример использования свойств:

type

TCircle = class

private

FХ, FY: Real; // поля-координаты центра

FR: Real; // поле-радиус

function GetR: Real; // метод чтения свойства R

procedure SetR(const Value: Real); // метод записи свойства R

public

property X: Real read FX write FX; // свойство для чтения/записи поля

// FX

property Y: Real read FY write FY; // свойство для чтения/записи поля

//FY

property R: Real read GetR write SetR; // свойство для

// чтения/записи поля FR

function Area: Real;

function Circumference2: Real;

function Inside(X, Y: Real): Boolean

end;

implementation

function TCircle.GetR: Real; // реализация метода чтения

begin // свойства R

Result:= FR;

end;

procedure TCircle.SetR(const Value: Real); // реализация метода записи свойства R

begin

if Value > 0 then FR:= Value; // проверяем допустимость значения

end;

Прокомментируем особенности примера:

При присвоении свойству R какого-либо значения, будет вызван метод записи SetR, которому в качестве параметра Value будет передано присваиваемое значение.

Далее все зависит от программиста, в данном случае если значение будет меньше или равно нулю, оно не будет присвоено полю, т.е. будет отвергнуто как недопустимое. В случаях со свойствами X и Y реализуются стандартные методы чтения и записи в поля, поэтому вместо имен методов указаны имена полей.

Вопросы для самоконтроля

1. Какие три концепции лежат в основе ООП?

2. В чем связь инкапсуляции и понятия класса?

3. Что такое наследование?

4. Какие преимущества дает наследование с точки зрения программирования?

5. Как определить отличия класса потомка от класса предка?

6. Что такое полиморфизм?

7. Какие преимущества дает полиморфизм с точки зрения программирования?

8. Что такое поле с точки зрения класса?

9. Как принято обозначать поля и почему?

10. В чем назначение свойств?

11. Из каких частей состоит описание свойства?

12. В чем отличие полей от свойств?

13. Какова последовательность описания полей свойств и методов внутри класса?

Задание

Напишите реализацию классов «Кольцо» и «Окружность».

<< | >>
Источник: РазработкА и эксплуатациЯ автоматизированных информационных систем. ЛЕКЦИИ.

Еще по теме Лекция 3.2. Основные концепции ООП. Поля и свойства:

  1. 16. Авторские договоры: издательский, постановочный, сценарный;художественного заказа.
  2. Этапы добровольного исполнения рекомендаций
  3. Глава 2. Служба в полиции как вид правоохранительной службы: опыт России, Великобритании и США