31246-1 (663239), страница 14

Файл №663239 31246-1 (Object Pascal) 14 страница31246-1 (663239) страница 142016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 14)

TPredok = class {объявление класса-предка}

Value: Integer;

end;

TPotomok = class(TPredok) {объявление класса-потомка}

Value: string; {перекрытие наследуемого поля}

end;

var

My1: TPredok; {объявление переменной класса}

My2: TPotomok; {объявление переменной-класса}

begin

My1 := TPotomok.Create; {создает класс типа TPredok !}

My2 := TPotomok.Create; {создает класс типа TPotomok}

My1.Value := 'Hello!'; {ошибка, не тот тип поля TPredok}

My2.Value := 'Hello!'; {правильно, работает поле Value: String}

My2.Value := 8; {ошибка: поле Value: Integer перекрыто}

end;

В этом примере описано два класса: TPredok – предок и TPotomok – потомок. Каждый из классов содержит одноименные поля Value разных типов.

Далее в var-секции объявлены две различные переменные My1 и My2 типа class. На первый взгляд может показаться, что оператор-конструктор объекта My1:= TPotomok.Create создаст объект My1 (выделит под него память) типа TPotomok. Однако это не так, поскольку My1 имеет другой тип. По этой причине конструктор создаст объект родительского типа, т. е. объект типа TPredok. Теперь становится понятен источник ошибок, которые имеют место в нескольких операторах приведенного примера.

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

Методом класса является инкаспулированная процедура или функция. Эти подрограммы объявляются так же, как обычные подпрограммы. Метод должен быть объявлен в описании класса в виде отдельного заголовка, а код метода – описан в секции implementation с указанием через символ "." принадлежности метода к своему классу, например:

type

TMyClass = class(TObject){объявление класса}

...

procedure DoSomething; {объявление метода DoSomething}

...

end;

Описание для DoSomething должно быть приведено позже в секции implementation модуля:

procedure TMyClass.DoSomething;{вид заголовка класс.метод}

begin

...

end;

При обращении к методу возможно использование составного имени либо оператора With, например:

Var KdnClass: TKdnClass;

KdnClass.MyProc1; // два примера обращения к методам

X:= KdnClass.MyFunc2; // с помощью составных имен

With KdnClass do // те же обращения

Begin // с помощью оператора With

MyProc1;

X:=MyFunc2;

End;

Одноименные методы могут перекрываться в потомках точно так, как это показано в примере перекрытия полей. Такое перекрытие называется статическим.

Для расширения возможностей чаще используется динамическое перекрытие. Для этого родительский метод должен иметь директиву dinamic (динамический метод) или virtual (виртуальный метод), а перекрывающий метод – директиву override. Пример:

type

TFigure = class

procedure Draw; virtual; {виртуальный метод}

end;

TRectangle = class(TFigure)

procedure Draw; override; {перекрывающий метод}

end;

TEllipse = class(TFigure)

procedure Draw; override; {перекрывающий метод}

end;

В этом примере объявлен виртуальный метод Draw родительского класса TFigure и два одноименных метода в классах-потомках TRectangle и TEllipse. Последние объявлены перекрывающими (override).

Такое объявление позволяет перекрывать методы с целью достижения нужных целей:

var

Figure: TFigure;

begin

Figure := TRectangle.Create; //создание класса

Figure.Draw; // вызов TRectangle.Draw

Figure.Destroy; // уничтожение класса

Figure := TEllipse.Create; //создание класса

Figure.Draw; // вызов TEllipse.Draw

Figure.Destroy; // уничтожение класса

end;

Семантически виртуальный и динамический методы работают одинаково. Разница состоит в том, что виртуальный метод оптимизирует скорость вычислений, а динамический метод оптимизирует размер соответствующего программного кода.

В классе метод может быть объявлен абстрактным с помощью директивы adstract. Такой метод является виртуальным или динамическим, однако, в отличие от других методов, может не иметь в секции implementation своего кода. Класс, имеющий абстрактные методы, называется абстрактным. Такие классы и методы могут ничего не делать, инкаспулируя таким способом доступ к методам потомков, например:

procedure DoSomething; virtual; abstract;

Обращение к неперекрываемому абстрактному методу вызывает ошибку времени выполнения (run time error), например:

Type

TClass2 = class(TClass0)

procedure Paint; virtual; abstract;

end;

TClass1 = class(TClass0)

procedure Paint; override;

end;

var

jClass1: TClass1;

jClass2: TClass2;

begin

jClass1.Paint; // правильно

jClass2.Paint; // неправильно: обращение к абстрактному методу

end;

Каждый класс имеет два особых метода – конструктор и деструктор. Конструктор предназначен для создания класса, т. е. для выделения под него динамической памяти. Деструктор, наоборот, предназначен для уничтожения класса, т. е. для освобождения участка памяти, занятого этим классом. В классе TObject имеются стандартные методы Create (создать) и Destroy (уничтожить). В этом классе объявлен также метод Free, который сначала проверяет корректность адреса и только потом вызывает метод Destroy. В этой связи предпочтительнее использовать метод Free вместо метода Destroy. Всякий класс по умолчанию содержит переменную Self, в которую после выделения динамической памяти помещается адрес класса. Прежде чем выполнить обращение к методам класса, его нужно создать. Хотя конструктор и деструктор являются процедурами, они объявляются специальными словами. Конструктор объявляется словом Constructor, деструктор – словом Destructor. Часто для обеспечения доступа к полям предка в конструкторе необходимо предварительно создать класс-предок. Это можно сделать c помощью слова Inherited.

Пример:

type

TShape = class(TGraphicControl)

Private {внутренние объявления}

FPen: TPen;

FBrush: TBrush;

procedure PenChanged(Sender: TObject);

procedure BrushChanged(Sender: TObject);

public {внешние объявления}

constructor Create(Owner: TComponent); override;

destructor Destroy; override;

...

end;

constructor TShape.Create(Owner: TComponent);

begin

inherited Create(Owner); // создание класса-предка TGraphicControl

Width := 65; // изменение наследуемых свойств TGraphicControl

Height := 65;

FPen := TPen.Create; // создание отдельного поля TPen типа class

FPen.OnChange := PenChanged;

FBrush := TBrush.Create; // создание отдельного поля TBrush типа class

FBrush.OnChange := BrushChanged;

end;

Некоторые простые классы могут быть созданы и уничтожены без объявления конструкторов и деструкторов. Например, если класс является потомком TObject, то в нем явно Constructor и Destructor в некоторых случаях объявлять нет нужды:

Type TClassy = class;

..

var Classy: TClassy;

Classy:= TClassy.Create; {создание класса}

Classy:= TClassy.Free; {уничтожение класса}

В языке имеется возможность объявлять в пределах одного класса несколько методов с одним и тем же именем. При этом всякий такой метод должен быть перезагружаемым (директива overload). Компилятор такие методы идентифицирует по своим уникальным наборам формальных параметров. Для того чтобы отменить реакцию компилятора Delphi на появление метода с тем же именем, каждый такой метод нужно пометить директивой reintroduce. Далее в секции implementation необходимо привести коды всех таких методов.

Пример:

Type TClassy = class;

Procedure HH(i, j: byte; var s: String); reintroduce; overload;

Procedure HH(q: String); reintroduce; overload;

Procedure HH(a: array oh Integer); reintroduce; overload;

implementation

Procedure TClassy.HH(i, j: byte; var s: String);

Begin

S:=IntToStr(i + j);

End;

Procedure TClassy.HH(q: String);

Begin

L2.Cattion:= q;

End;

Procedure TClassy.HH(a: array oh Integer);

Begin

L1.Cattion:= IntToStr(a[6] + a[4]);

End;

Теперь, после обращения к методу по имени TClassy.HH, программа вызовет именно тот метод, формальные параметры которого соответствуют фактическим параметрам в обращении.

18.5. Свойства класса

Свойства, как и поля, являются атрибутами класса. Свойства объявляются с помощью слов property, read и write. Слова read и write конкретизируют назначение свойства. Синтаксис свойства таков:

property propertyName[indexes]: type index integerConstant specifiers;

где propertyName – имя свойства; [indexes] – параметры-имена в форме имя1, имя2, ... , имяN: type; index – целая константа; read, write, stored, default (или nodefault) и implements – спецификации. Всякое объявление свойства должно иметь одну из спецификаций read или write или обе вместе.

Примеры:

property Objects[Index: Integer]: TObject read GetObject write SetObject;

property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;

property Values[const Name: string]: string read GetValue write SetValue;

property ErrorCount: Integer read GetErrorCount;

property NativeError: Longint read FNativeError;

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

Каждое свойство может иметь спецификацию read или write или оба вместе в форме

read fieldOrMethod

write fieldOrMethod

где fieldOrMethod – имя поля или метода, объявленного в классе, или свойство класса-предка.

Если fieldOrMethod объявлено в классе, то оно должно быть определено в том же классе. Если оно объявлено в классе-предке, то оно должно быть видимо из потомка, т. е. не должно быть частным полем или методом класса-предка. Если свойство есть поле, то оно должно иметь тип. Если fieldOrMethod есть read-спецификация, то оно должно быть функцией без параметров, тип которой совпадает с типом свойства. Если fieldOrMethod есть write-спецификация и метод, то оно должно быть процедурой, возвращающей простое значение или константу того же типа, что тип свойства. Например, если свойство объявлено:

property Color: TColor read GetColor write SetColor;

тогда метод GetColor должен быть описан как

function GetColor: TColor;

и метод SetColor должен быть описан как

procedure SetColor(Value: TColor);

или

procedure SetColor(const Value: TColor);

Если свойство имеет спецификацию read, то оно имеет атрибут "read only" (только для чтения). Если свойство имеет спецификацию write, то оно имеет атрибут "write only" (только для чтения).

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

Всякий класс имеет структуру, которая состоит из секций. Каждая секция объявляется специальным зарезервированным словом. К их числу относятся: published (декларированные), private (частные), protected (защищенные), public (доступные), automated (автоматизированные). Внутри каждой секции сначала объявляются поля, затем – свойства и методы.

Пример:

type

TMyClass = class(TControl)

private

... { частные объявления здесь}

protected

... { защищенные объявления здесь }

public

... { доступные объявления здесь }

published

... { декларированные объявления здесь }

end;

Секции определяют области видимости компонент класса:

Private – компоненты класса доступны только внутри этого класса;

Public – компоненты класса доступны в текущем и любом другом модуле, который содержит ссылку в списке uses на модуль, в котором объявлен класс;

Published – то же, что Public, однако в ней должны быть перечислены свойства, которые доступны не только на этапе выполнения программы, но и на этапе ее визуального конструирования средствами Delphi;

Protected – cекция доступна только методам текущего класса и методам классов-предков;

Automated – секция используется для объявления свойств и методов обработки OLE-контейнеров в рамках OLE-технологии.

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

18.7. Операции над классами

Над классами разрешено выполнять две операции – is и as.

1. Операция is. Синтаксис выражения, содержащего операцию is, имеет вид

object is class

Это выражение имеет логический тип (boolean) и возвращает True, если переменная object имеет тип class класса, иначе – False.

Пример:

if ActiveControl is TEdit then TEdit(ActiveControl).SelectAll;

В этом примере: если класс ActiveControl имеет тип TEdit, то будет выполнен метод TEdit(ActiveControl).SelectAll.

2. Операция as. Синтаксис выражения, содержащего операцию as:

object as class

Характеристики

Тип файла
Документ
Размер
606,93 Kb
Материал
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6730
Авторов
на СтудИзбе
284
Средний доход
с одного платного файла
Обучение Подробнее