Абстрактные методы — объявление, наследование, полиморфизм
Абстрактными называются методы, которые определены в классе, но не содержат его реализации в этом классе. Они никогда не вызываются в объявленном классе и должны быть переопределены и реализованы в его наследниках. Абстрактными могут быть только виртуальные и динамические методы. Их основное назначение, — абстрагируясь от частностей, быть родоначальниками иерархии конкретных методов в классах наследниках. Такие методы лежат в основе принципа полиморфизма.
Для объявления метода абстрактным используется слово-директива Abstract, которое указывается после слова-директивы Virtual (Dynamic). Эта директива действительна лишь при первом объявлении метода класса. Если абстрактный метод в наследниках оказался неопределенным, то его вызов генерирует ошибку или исключительную ситуацию.
В VMT (DMT) для абстрактного метода резервируется строка, в которую вместо адреса вызова метода заносится Nil.
Примечание:
• Объявления методов, как и полей можно переносить из одного раздела в другой. Не-возможно только переносить объявления из раздела Private в раздел с большей видимостью.
Повторное объявление методов (перегрузка методов)
Повторное объявление обычных процедур и функций, а также методов позволяет создавать подпрограммы с одинаковыми именами, но с несколько различными возможностями. Перегрузка нужна для того, чтобы произвести одинаковые или похожие действия с разнотипными данными. Виртуальными их сделать нельзя, поскольку тогда тип и число параметров должны совпадать.
Для указания компилятору о TQM, что подпрограммы, включая конструкторы и статические методы, имеют одинаковые имена, используется слово-директива Overload у каждой из них, при объявлении в одном классе или у предка и потомка. Подпрограммы, объявленные с директивой Overload, должны различаться или числом или типом параметров (тип результата функции не является различием). Оба перегружаемых метода доступны, даже если второй определен в классе-наследнике, поскольку компилятор определит различие в параметрах.
Есть два ограничения на перегрузку методов:
• нельзя дважды перегружать методы в разделе Published одного и того же класса;
• для объявления виртуального метода перегружаемым в классе-наследнике дополнительно добавляется слово-директива Reintroduce. Синтаксис применения директивы Reintroduce:
Procedure <имя метода>[(<параметры>)]; Reintroduce; Overload;
Type T1=Class
Procedure Test(I: Integer); Overload; Virtual;
End; // В базовом классе не обязательно помечать метод как OverloadT2=Class(T1)
Procedure Test(S: String); Reintroduce; Overload;
End;Begin
SomeObject:=T2.Create;
SonieObject.Test(‘HeIlo’); // Фактически вызывается Т2.Test
SomeObject.Test(7); // Фактически вызывается Т1.Test
Tl(SomeObject).Test(7); // Можно и так, если известно имя – Т1
По отношению к методам перегрузка позволяет упростить доступ к одноименным методам родительского класса, не зная имя класса с одноименным методом.
Дружественные классы
В языке C++ с помощью ключевого слова friend реализуется концепция дружественных классов, т.е. классов, объектам которых разрешен доступ к Private полям и методам другого класса. В ОР подобного слова нет, однако объекты классов, описанных в одном модуле, имеют взаимный доступ ко всем разделам объектов другого класса. Таким образом фактически реализуется дружественность классов в Delphi.