![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть ли возможность проверить, перекрыт ли абстрактный метод? [WinXP]
Aleksandr. © (2005-08-02 13:52:00)Помимо try ... except on E:EAbstractError do end
Допустим, в объекте-предке объявлен статичный Method1 и виртуальный абстрактный Method2. Method1 в своем теле всегда вызывает Method2, но, если по какой-то причине Method2 был не перекрыт у какого-либо потомка, то это приведет к ошибке Abstract Error. В принципе, есть схема try Method2 except on E:EAbstractError do end, но мне как-то не нравится вообще подход с подавлением ошибок, поэтому и возникает вопрос - а есть ли возможность как-то корректнее проверить, перекрыт ли абстрактный метод?
Суслик (2005-08-02 18:18:00) [1]если есть в побребность в сабже, то, имхо, есть проколы в проектировании классов.
и зачем подавлять? согласен с Леонидом из [3]
TUser (2005-08-02 18:14:00) [2]Полностью согласен с [2], но если хочется повыпендриваться, то
type
TC1 = class
public
procedure M1;
procedure M2; virtual; abstract;
end;
TC2 = class (TC1)
public
procedure M2; override;
end;
procedure TC1.M1;
var P1, P2: procedure of object;
T: TC1;
begin
T := TC1.Create;
P1 := Self.M2;
P2 := T.M2;
if @P1 @P2 then
M2
else ShowMessage ('M2 not found')
end;
procedure TC2.M2;
begin
ShowMessage ('Overriden method')
end;
procedure TForm1.Button1Click(Sender: TObject);
var c: TC1;
begin
c:=TC1.Create; // ìåíÿé òóò TC1 íà TC2
c.M1;
c.Free;
end;
Leonid Troyanovsky (2005-08-02 14:36:00) [3]
> Aleksandr. (02.08.05 13:52)
> Abstract Error. В принципе, есть схема try Method2 except
> on E:EAbstractError do end, но мне как-то не нравится вообще
> подход с подавлением ошибок, поэтому и
А зачем их подавлять? Они вполне, IMHO, неплохо сигнализируют
о том, что оный метод не реализован.
Ну, а если хочется, то можно сравнивать адреса метода в
реализации и в базовом методе, как уже подсказали.
--
Regards, LVT.
evvcom (2005-08-02 14:30:00) [4]
> а есть ли возможность как-то корректнее проверить, перекрыт
> ли абстрактный метод?
А зачем? Если он должен быть перекрыт, то получишь ошибку и начнешь ее править. Если допустимо не перекрывать, то в базовом классе сделай пустую реализацию метода. И всех делов.
Lamer@fools.ua (2005-08-02 14:07:00) [5]Посмотрите исходники класса TStream, там как раз такая проверка делается, если не ошибаюсь.