Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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; // &#236;&#229;&#237;&#255;&#233; &#242;&#243;&#242; TC1 &#237;&#224; TC2
 c.M1;
 c.Free;
end;


 
Суслик ©   (2005-08-02 18:18) [5]

если есть в побребность в сабже, то, имхо, есть проколы в проектировании классов.

и зачем подавлять? согласен с Леонидом из [3]



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
3-1121317131
Kara
2005-07-14 08:58
2005.08.21
Определение базы


4-1120126541
BiN
2005-06-30 14:15
2005.08.21
Прототип IoVolumeDeviceToDosName в user-mode.


1-1122555255
BFG9k
2005-07-28 16:54
2005.08.21
Одновременное скроллирование


4-1115980324
leonidus
2005-05-13 14:32
2005.08.21
Перехват нажатия клавиши CTRL


14-1122567143
Ego
2005-07-28 20:12
2005.08.21
Творческий кризис.