У меня есть абстрактный базовый класс и производный класс:
type TInterfaceMethod = class
public
destructor Destroy; virtual; abstract;
procedure Calculate; virtual; abstract;
procedure PrepareForWork; virtual; abstract;
end;
type ConcreteMethod = class(TInterfaceMethod)
private
matrix: TMinMatrix;
public
constructor Create(var matr: TMinMatrix);
procedure Calculate; override;
procedure PrepareForWork; override;
destructor Destroy;
end;
Действительно ли мне нужно делать деструктор базового класса виртуальным, как в C++, или все будет нормально, если он не виртуальный?
Кстати, я использовал право «переопределить» или мне нужна «перегрузка»?





Переопределение правильное - вы переопределяете виртуальный метод.
Если вы действительно хотите, чтобы деструктор TInterfaceMethod выдавал ошибку EAbstractError, вам нужно будет пометить ее как 'override; Аннотация;'. (Я удивлен, что это работает, но я тестировал D2007, и он работает.) Но зачем вам это делать?
Кстати, нет необходимости использовать отдельный блок типа для каждого объявления. Вы можете отформатировать код так:
type
TInterfaceMethod = class abstract
public
destructor Destroy; override; abstract;
procedure Calculate; virtual; abstract;
procedure PrepareForWork; virtual; abstract;
end;
TConcreteMethod = class(TInterfaceMethod)
private
matrix: TMinMatrix;
public
constructor Create(var matr: TMinMatrix);
procedure Calculate; override;
procedure PrepareForWork; override;
destructor Destroy; override;
end;
Кроме того, вам, скорее всего, следует использовать интерфейсы вместо абстрактного базового класса. И вы должны отметить класс TInterfaceMethod как абстрактный, как указано выше. Теоретически это помешало бы вам создать объект TInterfaceMethod напрямую. (На практике мой D2007 позволяет это - странно.)
Просто придираться ;-).
Виртуальный деструктор destroy уже существует (и используется Free). Поэтому, если вы объявите такой класс, у вас возникнут проблемы.
Но резюмируя некоторые директивы метода: