![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наследование
cyborg © (2008-08-18 14:45:00)Просто для интереса, допустим есть класс:
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.
Leonid Troyanovsky (2008-08-18 16:20:00) [1]
> cyborg (18.08.08 16:00) [5]
> Интересный способ. Только получается Abort немного не по
> назначению используется.
Abort это чтобы мне меньше писать, а, во-ще, д.б. собс-ный
класс исключения.
Да и, во-ще, над проектированием еще надо поднаразмышлять.
--
Regards, LVT.
cyborg (2008-08-18 16:16:00) [2]
> Почему не по назначению?
Ну, так это же не исключение, а вполне нормальное поведение.
Германн (2008-08-18 16:09:00) [3]
> Только получается Abort немного не по назначению используется.
Почему не по назначению?
cyborg (2008-08-18 16:00:00) [4]
> Leonid Troyanovsky © (18.08.08 15:49) [4]
Интересный способ. Только получается Abort немного не по назначению используется.
Спасибо.
Leonid Troyanovsky (2008-08-18 15:49:00) [5]
> 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 15:06:00) [6]
> 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 14:57:00) [7]
> cyborg (18.08.08 14:45)
> у TCl.Check и если у TCl.Check сработает Exit, то он бы
> сработал и у TCl2.Check.
Exit работает везде.
М.б., речь шла про Abort/Raise?
--
Regards, LVT.
Palladin (2008-08-18 14:51:00) [8]во первых нужно метод сделать виртуальным
во вторыхresult:= inherited Check(aParam);