![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
наследование [D7, WinXP]
Andrushk © (2003-01-10 15:40:00)Как сделать следующую штуку:
вызывается некая процедура 1, в ней первой строкой стоит вызов предка. В процедуре предке делаются некие действия. Надо сделать так, что если выполниться условие, то надо выйти из процедуры, причем выйти так, чтобы не выполнились действия стоящие после inherited. И вот еще, procedure 1 - менять нельзя (т.к. потомков уже слишком много)
Предок
----
procedure....2
begin
ОПЕРАТОРЫ
if условие=true then //выйти
// с этого места надо прервать выполнение процедуры
ОПЕРАТОРЫ
end;
----------
Потомок
----
procedure....1
begin
inherited
// сюда уже попасть мы не должны
ОПЕРАТОРЫ
end;
----------
Andrushk (2003-01-14 11:53:00) [1]> Calm
Понял, хитро конечно :-)
Calm (2003-01-11 13:22:00) [2]
> Andrushk (11.01.03 11:37)
...
> >Calm,Skier Может я недопонял ваших методов, если разъясните
> - буду очень признателен...я думаю, пригодиться мне для
> общего развития
Я же написал, что перекрыватьв потомках следует метод MyAction, но для выполнения действия вызывать НЕ MYACTION, а DoIt.
Безусловно, использование исключения - хороший способ решения проблемы. Но считаю, что следует стремиться к уменьшению их количества. Ведь можно просто где-то забыть его отловить...
Andrushk (2003-01-11 11:37:00) [3]>TTCustomDelphiMaster
Действительно, получается проще некуда...Спасибо!
>Calm,Skier Может я недопонял ваших методов, если разъясните - буду очень признателен...я думаю, пригодиться мне для общего развития
TTCustomDelphiMaster (2003-01-10 19:53:00) [4]Генерируй исключение в procedure....2
Andrushk (2003-01-10 19:14:00) [5]>Skier Не понял идеи, можно подробнее
>Calm А чего именилось то?
Ну я перекрою DoIt в потомке, когда он сработает сработает inherited и вызовется DoIt предка, допустим условие сработает, и что? что должно стоять в MyAction чтобы управление больше не передалось потомку? Мне-то надо что, что если сработает условие, то тогда все стоящее после inherited уже не сработает
Calm (2003-01-10 15:50:00) [6]Нужно привести логику организации класса к виду
TПредок=class
private
function Check:boolean; // это неизменно всегда
protected
procedure MyAction; virtual; // это будет перекрывать в
public
procedure DoIt; // Это нужно вызывать в потомках, чтобы выполнить действия из MyActon
потомках
end;
procedure TПредок.DoId;
begin
if Check
then MyAction;
end;
Тогда и проблем с проверкой не будет и перекрывать можно все, что угодно.
Skier (2003-01-10 15:47:00) [7]>Andrushk
Ну ежели менять нельзя, то попробуй извратиться с
помощью флага, (флаг - должен быть полем класса).
А лучше бы конечно сделать Предок.процедура1 -> Предок.функция1