Абстрактные методы |
Вверх Предыдущий Следующий |
Абстрактный метод представляет собой особый вид виртуального метода. Метод, который объявлен как abstract (абстрактный) не нуждается в реализации. Это задача для объектов-потомков, они должны переопределить и реализовать этот метод. Из этого следует, что метод не может быть абстрактным, если он не виртуальный (это видно из синтаксической схемы). Второе следствие состоит в том, что экземпляр объекта, который имеет абстрактный метод не может быть создан непосредственно. Причина очевидна: не существует метода, который компилятор может выполнить. Метод, который объявлен abstract не имеет реализации. Она зависит только от потомков объектного типа, которые должны переопределить и реализовать этот метод. Продолжая наш пример, посмотрите на это: Type TParent = Object ... procedure Doit;virtual;abstract; ... end; PParent=^TParent; TChild = Object(TParent) ... procedure Doit;virtual; ... end;
PChild = ^TChild; Как видно, оба объекта родитель и ребенок имеют метод, называемый DoIt. Рассмотрим следующие объявления и вызовы: Var ParentA,ParentB : PParent; Child : PChild; begin ParentA := New(PParent,Init); ParentB := New(PChild,Init); Child := New(PChild,Init); ParentA^.Doit; ParentB^.Doit; Child^.Doit; Во-первых, на строке 3 будет сгенерирована ошибка компиляции, сообщая, что нельзя создавать экземпляры объектов с абстрактными методами: компилятор обнаружил, что PParent указывает на объект, который имеет абстрактный метод. Закомментировав третью строчку, удастся скомпилировать программу.
|