-
Здраствуйте все. Не могу найти ответа на свой вопрос Допустим, есть форма-предок, в котором есть функция function Ok: Boolean; virtual;
begin
if Result then ...
end; Создаю форму наследника и переопределяю процедуру function Ok: Boolean; override;
begin
inherited Ok;
Но при вызове inherited Ok в процедуре предка Result будет равно False. Как бы выполнить процедуру предка со значением Result, полученным из потомка? Надеюсь, что понятно объяснил. Спасибо заранее всем ответившим.
-
Либо через параметр, либо через служебное private-поле.
-
Сделай поле FOkResult или передавай как параметр function Ok (Res : bolean = false): boolean
-
function Ok(defaultresult: boolean=true): boolean; virtual;
-
по-моему, будет правильнее разнести функцию определяющую Ok или неOk и функцию делающую на этой основе какие-литбо действия.
Функцию определяющую ok или нет сделать виртуальной и переопределять в потомках, в базовой форме в методе, который на этот результат ориентируется вызывать функцию Ok() и выполнять нужные действия.
А сейчас мне ддумается интерфейс просто не правильно спроектирован, от того и траблы его использования, это верняцкий признак всегда.
PS Исхожу из того, что метод Ok не начинается буквально с if Result then ... как написано в вопросе, а все ж есть какая-то перед тем логика определения этого Result
-
> function Ok: Boolean; virtual; > begin > if Result then ... > end;
Это неправильная функция, потому что Result-у до использования надо что-то присвоить
-
> function Ok: Boolean; virtual; > begin > if Result then ... > end; >
Компилятор умный, он эту строку уже выкинул и информировал недокодера соответствующим сообщением.
-
function Ok: Boolean; override; begin // действия в результате которых Result := True; // а здесь я хочу вызывать функцию предка Result := inherited;
-
[4] Если вы мне приведете пример - я буду вам очень признателен. Ибо признаюсь, прочитав текст, не совсем понял. Суть функции Ок в предке: Если функция Ок в потомке выполнилась успешно, то выполнит какие-либо действия. Например, if Result then Func(Sender); [5], [6] Согласен, что неправильная. Но я пока учусь и пробую. [1], [2], [3] Так и подумал "через параметр", но думал может можно по другому. Приват-поле не подойдет по идее, т.к. в случае различных процедур (Boolean, Integer, String и т.д.) - придется делать 3 разных приват-поля
-
> Согласен, что неправильная. Но я пока учусь и пробую
А чего хочется-то ? А то непонятно
-
TMyObject = class(TMyBaseObject);
.........
function TMyBaseObject.Ok: Boolean; virtual;
begin
Result := True;
end;
procedure TMyBaseObject.DoSomeAction;
begin
if Ok then ......
end;
.........
function TMyObject.Ok: Boolean; virtual;
begin
Result := False;
if ... then
begin
if ... then
begin
.....
Result := True
end;
end;
end;
-
> А чего хочется-то ? А то непонятно
Ну конкретно функция Ок вызывается по нажатию на кнопку Ок / Сохранить / Принять в модальном окне. Причем есть общие действия для всех окон и индивидуальные для каждого окна. Вот и думаю как правильно сделать. TfrmCustomModal = class(TForm)
procedure aOkExecute(Sender: TObject);
procedure aCancelExecute(Sender: TObject);
private
protected
l_FuncCallBackOk, l_FuncCallBackCancel: TFuncCallBack; public
function Ok: Boolean; virtual;
function Cancel: Boolean; virtual;
end; function TfrmCustomModal.Ok: Boolean;
begin
if Result and Assigned(l_FuncCallBack) then
Result := l_FuncCallBackOk(dsRecord.DataSet, FKey);
end;
function TfrmCustomModal.Cancel: Boolean;
begin
if Result and Assigned(l_FuncCallBack) then
Result := l_FuncCallBackCancel(dsRecord.DataSet, FKey);
end;
procedure TfrmCustomModal.aOkExecute(Sender: TObject);
begin
try
aOk.Enabled := False;
aCancel.Enabled := False;
if Ok then
Close;
finally
aOk.Enabled := True;
aCancel.Enabled := True;
end;
end;
procedure TfrmCustomModal.aCancelExecute(Sender: TObject);
begin
try
aOk.Enabled := False;
aCancel.Enabled := False;
if Cancel then
Close;
finally
aOk.Enabled := True;
aCancel.Enabled := True;
end;
end; Ну вот как бы так. И возник вопрос, как перекрыть методы Ok и Cancel в потомке. Судя по [10], придется значит разделять методы предка и методы потомка %)
-
Неправильно вставил. В соответствующих местах: if Result and Assigned(l_FuncCallBackOk) then
Result := l_FuncCallBackOk(dsRecord.DataSet, FKey); и if Result and Assigned(l_FuncCallBackCancel) then
Result := l_FuncCallBackCancel(dsRecord.DataSet, FKey); Но это, думаю, непринципиально
-
И, вообще. Какого бы автора почитать про подобное наследование? Был бы очень признателен
-
Рыбба (20.01.09 15:46) [11] >>Судя по [10], придется значит разделять методы предка и методы потомка %)
Наследовать
TMyBaseObject=class(TForm) public function Ok: Boolean; virtual;
end;
TMyObject = class(TMyBaseObject); public procedure SomeThing; end;
TMyObject1 = class(TMyBaseObject); public function Ok: Boolean; overload; procedure SomeThing; end;
function TMyBaseObject.Ok: Boolean; virtual; begin Result := True; end;
procedure TMyObject.SomeThing; begin ok; //метод предка end;
function TMyObject1.Ok: Boolean; virtual; begin Result := false; end;
procedure TMyObject.SomeThing; begin ok; //свой метод inherited ok;//метод предка end;
-
> Ну конкретно функция Ок вызывается по нажатию на кнопку > Ок / Сохранить / Принять в модальном окне. Причем есть общие > действия для всех окон и индивидуальные для каждого окна. > Вот и думаю как правильно сделать.
Через OnCloseQuery
-
Но при вызове inherited Ok в процедуре предка Result будет равно False. Как бы выполнить процедуру предка со значением Result, полученным из потомка?
всего-то вар-параметр, пропущенный насквозь всей иерархии.
-
TMyBaseObject=class(TForm) public function Ok(var i:integer): Boolean; virtual; // потомок обязан иметь тот же вид что и предок
end;
-
> procedure TMyObject.SomeThing; > begin > ok; //свой метод > inherited ok;//метод предка > end;
В моем случае наверное if ok then inherited ok; > Через OnCloseQuery
Эээ... Недопонял. Вообще в OnCloseQuery проверяю допустим модифицированность записи и в случае True вывожу, например, диалог типа "Было изменено. Сохранить?" [16] То бишь, [2] и [3] ? А на вопрос о литературе можете ответить? Что почитать на эту тему?
-
Рыбба (20.01.09 16:02) [18] >>В моем случае наверное if ok then inherited ok; Это уже сам решай))
>>А на вопрос о литературе можете ответить? Что почитать на эту тему? Обьектно ориентрованное программирование, книг море.
|