Методы
Из предыдущего материала читатели узнали, что функционирование объектов обеспечивается различными типами методов, которые различаются особенностями реализации механизма наследования. Теперь настало время рассмотреть эти методы более подробно.
Абстрактными называются методы, которые определены в классе, но не содержат никаких действий, никогда не вызываются и обязательно должны быть переопределены в потомках класса. Абстрактными могут быть только виртуальные и динамические методы. В Object Pascal такие методы объявляются с помощью одноименной директивы. Она указывается при описании метода:
procedure NeverCallMe; virtual; abstract;
При этом никакого кода для этого метода писать не нужно. Вызов метода NeverCallMe приведет к созданию исключительной ситуации EAbstractError (исключительным ситуациям посвящена гл. 4).
Пример с классом TField из разд. "Полиморфизм" этой главы поясняет, для чего нужно использование абстрактных методов. В данном случае класс TField не используется сам по себе; его основное предназначение – быть родоначальником иерархии конкретных классов -"полей" и дать возможность абстрагироваться от частностей. Хотя параметр процедуры showData и описан как TField, но, если передать в нее объект этого класса, произойдет исключительная ситуация вызова абстрактного метода.
Статические методы, а также любые поля в объектах-потомках ведут себя одинаково: вы можете без ограничений перекрывать старые имена и при этом изменять тип методов. Код нового статического метода полностью перекрывает (заменяет собой) код старого метода:
type TlstObj = class i: Extended; procedure SetData(AValue: Extended); end; T2ndObj = class (TlstObj) i: Integer; procedure SetData(AValue: Integer); end; procedure TlstObj.SetData; begin i: = 1.0; end; procedure T2ndObj.SetData; begin i: = 1; inherited SetData (0.99); end;
В этом примере разные методы с именем SetData присваивают значения разным полям с именем i. Перекрытое (одноименное) поле предка недоступно в потомке; поэтому, конечно, два одноименных поля с именем i – это нонсенс; так сделано только для примера.
Примечание
В практике программирования принято присваивать всем идентификаторам в программе (в том числе полям объектов) осмысленные названия. Это существенно облегчит работу с исходным кодом не только другим разработчикам, но и вам.
В отличие от поля, внутри других методов перекрытый метод доступен при указании зарезервированного слова inherited. По умолчанию все методы объектов являются статическими – их адрес определяется еще на стадии компиляции проекта, поэтому они вызываются быстрее всего. Может быть, читателю еще не ясно, для чего упоминается этот факт. Просто запомните его, он понадобится при сравнении статических и виртуальных методов.