Текущий архив: 2005.08.21;
Скачать: CL | DM;
Вниз
Есть ли возможность проверить, перекрыт ли абстрактный метод? Найти похожие ветки
← →
Aleksandr. (2005-08-02 13:52) [0]Помимо try ... except on E:EAbstractError do end
Допустим, в объекте-предке объявлен статичный Method1 и виртуальный абстрактный Method2. Method1 в своем теле всегда вызывает Method2, но, если по какой-то причине Method2 был не перекрыт у какого-либо потомка, то это приведет к ошибке Abstract Error. В принципе, есть схема try Method2 except on E:EAbstractError do end, но мне как-то не нравится вообще подход с подавлением ошибок, поэтому и возникает вопрос - а есть ли возможность как-то корректнее проверить, перекрыт ли абстрактный метод?
← →
Lamer@fools.ua © (2005-08-02 14:07) [1]Посмотрите исходники класса TStream, там как раз такая проверка делается, если не ошибаюсь.
← →
evvcom © (2005-08-02 14:30) [2]
> а есть ли возможность как-то корректнее проверить, перекрыт
> ли абстрактный метод?
А зачем? Если он должен быть перекрыт, то получишь ошибку и начнешь ее править. Если допустимо не перекрывать, то в базовом классе сделай пустую реализацию метода. И всех делов.
← →
Leonid Troyanovsky © (2005-08-02 14:36) [3]
> Aleksandr. (02.08.05 13:52)
> Abstract Error. В принципе, есть схема try Method2 except
> on E:EAbstractError do end, но мне как-то не нравится вообще
> подход с подавлением ошибок, поэтому и
А зачем их подавлять? Они вполне, IMHO, неплохо сигнализируют
о том, что оный метод не реализован.
Ну, а если хочется, то можно сравнивать адреса метода в
реализации и в базовом методе, как уже подсказали.
--
Regards, LVT.
← →
TUser © (2005-08-02 18:14) [4]Полностью согласен с [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;
← →
Суслик © (2005-08-02 18:18) [5]если есть в побребность в сабже, то, имхо, есть проколы в проектировании классов.
и зачем подавлять? согласен с Леонидом из [3]
Страницы: 1 вся ветка
Текущий архив: 2005.08.21;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.037 c