Главная страница
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.037 c
6-1115462843
Sir
2005-05-07 14:47
2005.08.21
List + Port в FTp протоколе


4-1119940523
happyandry
2005-06-28 10:35
2005.08.21
Помогите с иконкой и ее обработкой


4-1120060152
Alex_Korn
2005-06-29 19:49
2005.08.21
Время создания ключа в реестре


1-1123066555
Гость22
2005-08-03 14:55
2005.08.21
Как слелать текст на форме мигающим?


9-1114775613
Alex_C
2005-04-29 15:53
2005.08.21
Алгоритм создания части окружности