Перегружаемые и абстрактные методы.
Еще одна разновидность методов – перегружаемые. В принципе и статические, и виртуальные, и динамические методы могут быть перегружаемыми. Перегрузка применяется когда необходимо выполнить одиночное действие с разными типами данных. 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|