Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Есть ли возможность проверить, перекрыт ли абстрактный метод? [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, там как раз такая проверка делается, если не ошибаюсь.


Наверх

Титульная страница Поиск, карта сайта Написать письмо