Абстрактные методы

На верх  Назад  Вперёд

Абстрактный метод представляет собой особый вид виртуального метода. Метод, который объявлен как 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 указывает на объект, который имеет абстрактный метод. Закомментировав третью строчку, удастся скомпилировать программу.

Замечание:

Если абстрактный метод переопределен, родительский метод не может быть вызван с помощью inherited, так как не существует реализации родительского метода, компилятор обнаружит это, и будет генерировать ошибку на это, вот так:

testo.pp(32,3) Error: Abstract methods can’t be called directly

testo.pp(32,3) Ошибка: Абстрактные методы не могут быть вызваны напрямую

Если абстрактный метод вызовут через некоторый механизм во время выполнения программы, то будет сгенерирована ошибка времени выполнения. (ошибка 211, если быть точным)