Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Реализован ли абстрактный метод в наследнике


Автор: r00xus 7.9.2015, 11:12
здравствуйте коллеги.

есть проект с кучей хаотично унаследованных друг от друга форм. мне нужно в некоторых формах в методе OnCreate сделать некие манипуляции с интерфейсом. решил добавить в базовый класс абстрактный метод WorkplaceConfig для этих целей, который срабатывает в OnCreate.
Код

unit uform_base;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type

  Tform_Base = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure WorkplaceConfig; virtual; abstract;
  end;

var
  form_Base: Tform_Base;

implementation

{$R *.dfm}

{ Tform_Base }

procedure Tform_Base.FormCreate(Sender: TObject);
begin
WorkplaceConfig; // вот здесь
end;

end.

но вот проблема: метод нужен только в некоторых формах. если не реализовать его в какой-то форме, то естественно вылетит исключение Abstract error. не хочется лазить по всем, смотреть что от чего унаследовано и лепить пустой WorkplaceConfig там где он мене и не нужен вовсе. можно конечно проверить наличие метода через RTTI, но такой подход кажется мне слишком громоздким и некрасивым.
вопрос: можно ли как-то проверить реализован ли абстрактный метод в потомке до его выполнения?

Автор: irwin.noteam.2009 7.9.2015, 11:29
а что мешает в базовой форме его оставить как virtual, просто в базовой форме сделать его пустым и переписывать только в нужных формах, а в ненужных он будет автоматом отрабатывать пустую функцию?
Код

Tform_Base = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure WorkplaceConfig; virtual;
end;

...

procedure Tform_Base.FormCreate(Sender: TObject);
begin
    WorkplaceConfig;
end;

procedure Tform_Base.WorkplaceConfig;
begin
end;


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Realizovan-li-abstraktny-metod-v-naslednike-id55ed4786ae20155e538b4567#findElement_E7045_55ed4af1ae2015eb5c863666_0

Автор: r00xus 7.9.2015, 11:58
блин точно! с абстрактным это я уже перемудрил smile

Автор: mikeyess 9.9.2015, 08:53
Добрый день.
При объявлении процедуры сами написали virtual; abstract;, к тому же у Вас процедура procedure Tform_Base.WorkplaceConfig; пустая. Все четко. Объявлен абстрактный класс, который нуждается в переопределении в потомках.
С уважением, Mike

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Realizovan-li-abstraktny-metod-v-naslednike-id55ed4786ae20155e538b4567#findElement_E7045_55efc973ae2015182b863960_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)