Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.28;
Скачать: CL | DM;

Вниз

Наследование   Найти похожие ветки 

 
cyborg   (2008-08-18 14:45) [0]

Просто для интереса, допустим есть класс:

TCl = class
 function Check(const aParam1: Integer): Boolean;
end;

function TCl.Check(const aParam1: Integer): Boolean;
begin
 Result := aParam = 3;
 if aParam = 10 then
   Exit;  
end;

и есть его потомок:

TCl2 = class
 function Check(const aParam1: Integer): Boolean;
end;

function TCl2.Check(const aParam1: Integer): Boolean;
begin
 inherited Check(aParam);
 ...
end;

Так вот, нельзя ли как-нибудь унаследовать присвоение Result"у и Exit? Т.е. чтобы Result у TCl2.Check стал таким же как у TCl.Check и если у TCl.Check сработает Exit, то он бы сработал и у TCl2.Check.


 
Palladin ©   (2008-08-18 14:51) [1]

во первых нужно метод сделать виртуальным
во вторых result:= inherited Check(aParam);


 
Leonid Troyanovsky ©   (2008-08-18 14:57) [2]


> cyborg   (18.08.08 14:45)  

> у TCl.Check и если у TCl.Check сработает Exit, то он бы
> сработал и у TCl2.Check.

Exit работает везде.
М.б., речь шла про Abort/Raise?

--
Regards, LVT.


 
cyborg   (2008-08-18 15:06) [3]


> Palladin ©   (18.08.08 14:51) [1]

Спасибо, а то я пытался писать вот так: inherited result := Check(aParam);


> Leonid Troyanovsky ©

Я имел в виду, что если записать вот так:

 TCl = class
 public
   function Check(const aParam: Integer): Boolean; virtual;
 end;

 TCl2 = class(TCl)
 public
   function Check(const aParam: Integer): Boolean; override;
 end;

function TCl.Check(const aParam: Integer): Boolean;
begin
 Result := aParam = 3;
 if aParam = 10 then
   Exit;
end;

function TCl2.Check(const aParam: Integer): Boolean;
begin
 Result := inherited Check(aParam);

 Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 vCl2: TCl;
 b: Boolean;
begin
 vCl2 := TCl2.Create;

 b := vCl2.Check(10);

 vCl2.Free;
end;

то b должно быть присвоено False.


 
Leonid Troyanovsky ©   (2008-08-18 15:49) [4]


> cyborg   (18.08.08 15:06) [3]

> то b должно быть присвоено False.


function TCl.Check(const aParam: Integer): Boolean;
begin
Result := aParam = 3;
if aParam = 10 then
  Abort;
end;

function TCl2.Check(const aParam: Integer): Boolean;
begin
try
  Result := inherited Check(aParam);
except
  on E: EAbort do Exit;
end;
Result := True;
end;

--
Regards, LVT.


 
cyborg   (2008-08-18 16:00) [5]


> Leonid Troyanovsky ©   (18.08.08 15:49) [4]

Интересный способ. Только получается Abort немного не по назначению используется.
Спасибо.


 
Германн ©   (2008-08-18 16:09) [6]


> Только получается Abort немного не по назначению используется.

Почему не по назначению?


 
cyborg   (2008-08-18 16:16) [7]


> Почему не по назначению?

Ну, так это же не исключение, а вполне нормальное поведение.


 
Leonid Troyanovsky ©   (2008-08-18 16:20) [8]


> cyborg   (18.08.08 16:00) [5]

> Интересный способ. Только получается Abort немного не по
> назначению используется.

Abort это чтобы мне меньше писать, а, во-ще, д.б. собс-ный
класс исключения.
Да и, во-ще, над проектированием еще надо поднаразмышлять.

--
Regards, LVT.



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

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

Наверх




Память: 0.48 MB
Время: 0.027 c
4-1197207030
EgorovAlex
2007-12-09 16:30
2008.09.28
Пул потоков и приоритет - начал тестирование QueueUserWorkItem


15-1217733481
PZ
2008-08-03 07:18
2008.09.28
День железнодорожника


2-1218799140
Nell
2008-08-15 15:19
2008.09.28
Уменьшить JPEG


2-1218647371
Logger
2008-08-13 21:09
2008.09.28
Как вынести в отдельный юнит, свои Конструкторы? (constr)


2-1219219368
silver222
2008-08-20 12:02
2008.09.28
ado paradox