Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Перегружаемые и абстрактные методы.




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

type TFirstObject = class (TObject)

i: extended

procedure SetValue (AValue: extended);

end;

TSecondObject = class (TFirstObject)

j: integer

procedure SetValue (AValue: integer)

end;

 

var T1: TFirstObject;

T2: TSecondObject;

begin

T1:= TFirstObject.Create;

T2:= TSecondObject.Create;

T2.SetValue (1.0)

T2.SetValue (1)

Попытка исполнения из объекта T2 метода SetValue будет приводить к ошибке компиляции. Внутри объекта Т2 метод SetValue с параметром extended перекрыт и компилятор его не признает. Выходом из этой ситуации может послужить простое переименование методов. Однако если методов будет не 2, а порядка нескольких сотен, то возникнет вероятность появления ошибок. Сделать эти методы виртуальными или динамическими нельзя. Т.к. количество и тип параметров в одноименных методах должны совпадать. Для выхода из этой ситуации эти методы можно объявить перегружаемыми с помощью директивы overload.

procedure SetValue (AValue: Extended); overload

procedure SetValue (AValue: Integer); overload

Перегружать можно также виртуальные и динамические методы для этого используется директива reintroduce.

procedure SetValue (AValue: Extended); virtual; overload

procedure SetValue (AValue: Integer); overload; reintroduce.

На перегрузку методов накладывается следующее ограничение. Нельзя объявлять перегружаемыми методы расположенные в области видимости published.

Еще одна разновидность методов – абстрактные. Абстрактные методы – это методы, которые описаны в классе, но не содержат никаких действий, никогда не выдаются и они обязательно должны быть перекрыты в объекте-потомке. Абстрактными могут быть только виртуальные или динамические методы. Методы объявляются абстрактными с помощью директивы abstract.

procedure NeverCallMe; virtual; abstract;

В этом методе не должно содержаться описания. Попытка исполнения такого метода приведет к возникновению исключительной ситуации EAbstractError.

Класс TField сам по себе не используется (с прошлой лекции). Его основное предназначение стать родоначальником иерархии классов-потомков и абстрагироваться от частности. Несмотря, что процедура ShowData (AField: TField) попытка передачи параметра с таким типом вызывала бы генерацию исключительной ситуации.

 

Области видимости.

При описании новых классов важен разумный компромисс. С одной стороны требуется скрыть поля, свойства и методы, представляющие собой внутреннюю структуру класса, от конечного пользователя объекта, так как маловажные детали на этом уровне будут бесполезны и будут лишь мешать восприятию целостности объекта. С другой стороны, если слишком ограничить доступ к членам класса, то вновь созданный класс просто перестанет использоваться при дальнейшей разработке программного обеспечения. В модели объекта языка Object Pascal существует механизм доступа к составным частям объекта, определяющий область, где ими можно пользоваться. Эти области называются областями видимости. В языке Object Pascal существует 5 областей видимости. Методы, свойства и поля класса могут быть:

· public – общие;

· private – личные;

· protected – защищенные;

· published – опубликованные;

· automatic – используются при создании объектов автоматизации, в частности имеющих интерфейс COM (Component Object Model).

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

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

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

unit first

interface

type

TFirstObject = class (TObject)

private

Method1

protected

Method2

public

Method3

end;

procedure TestProc;

uses dialogs

var

FirstObj:TFirstObject

implementation

procedure TestProc

begin

FirstObj:= TFirstObject.Create

FirstObj.Method1;

FirstObj.Method2;

FirstObj.Method3;

end;

procedure TFirstObject.Method1

begin

ShowMessage(‘1’);

end;

procedure TFirstObject.Method2

begin

ShowMessage(‘2’);

Method2;

end;

procedure TFirstObject.Method3

begin

ShowMessage(‘3’);

Method2;

end;

// 2-й модуль

unit second

interface

type

TSecondObject = class (TFirstObject)

procedure Method4

end;

procedure TestProc2;

var

FirstObj: TFirstObject;

SecondObj: TSecondObject;

implementation

procedure TSecondObj.Method4

begin

Method1; //недопустимо

Method2; //допустимо

Method3; //допустимо

end;

procedure TestProc2;

begin

FirstObj:= TFirstObject.Create;

SecondObj:= TSecondObject.Create;

FirstObj. Method1; //недопустимо

FirstObj. Method2; //недопустимо

FirstObj. Method3; //допустимо

SecondObj. Method1; //недопустимо

SecondObj. Method2; //допустимо

SecondObj. Method3; //допустимо

FirstObj.Free;

SecondObj.Free;

end;

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

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

type

TFirstObject = class (Tobject)

private

FNumber: integer;

protected

property Number: integer read FNumber;

end;

TsecondObject = class (TFirstObject)

published

property Number;

end;

Если какое-либо свойство объекта из состава библиотеки визуальных компонентов VCL (Visual Component Library) будет описано в секции public, то вернуть ее обратно в секцию private не будет никакой возможности, обратное широко используется в Delphi. У многих компонентов из состава VCL есть классы-предки, отличающиеся от них лишь отсутствием опубликованных свойств.??????? Если есть необходимость создать новый редактируемый компонент, его следует???? и опубликовать те свойства, которые будут необходимы.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...