Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 наследование и виртуальные методы  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
Здравствуйте.

есть базовая форма.
в ней процедура декларированная как virtual.

базовая форма принимает сообщение инициализации и вызывает этот виртуальный метод. код в базовой для этой процедуры имеется.

от этой базовой последовательно унаследованы еще три формы. в каждой форме есть эта процедура с override.
те цепочка такая. форма3-форма2-форма1-форма базовая.

когда базовая получает сообщение и выполняет этот виртуальный метод - вызывается процедура из самой верхней формы. те из форма3. вроде как и задумано. но.
как сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма.

если в процедуре в форма3 ставлю сначала inherited, то переходит на код базовой формы. а хотелось бы, чтоб на код форма2.

Реально ли так сделать?)


Спасибо
19 июн 17, 16:37    [20575310]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43944

AndrewVL
если в процедуре в форма3 ставлю сначала inherited, то переходит на код базовой формы. а
хотелось бы, чтоб на код форма2.

Значит inherited у тебя какой-то неправильной системы, поскольку у всех остальных оно
вызывает как раз метод только непосредственного предка.

Posted via ActualForum NNTP Server 1.5

19 июн 17, 16:40    [20575331]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AX-Class
Member

Откуда:
Сообщений: 100
Создана форма3.
Хочется, чтоб при вызова виртуального метода, выполнялся код дедушки->папы->свой->прадедушки
Так?
Плохое проектирование.
19 июн 17, 17:58    [20575680]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
чччД
Guest
AndrewVL,

я в данном случае полиморфную виртуальную функцию я бы разделил на две, а в каждом классе-наследнике написал бы свою, чтобы можно было управлять

Для базового класса
public 
procedure Common_Base; virtual;
  Common_Base_Impl;
end
procedure Common_Base_Impl; 
begin
// реализация
end;

Для формы 1:
public 
procedure Common_Form1; override;
  inherited; // Вызов метода предка
  Common_Form1_Impl;
end
procedure Common_Form1_Impl; 
begin
// реализация
end;


Для формы 2:
public 
procedure Common_Form2; override;
  inherited; // Вызов метода предка
  Common_Form2_Impl;
end
procedure Common_Form2_Impl; 
begin
// реализация
end;



Ну для форму 3, раз уж нужно
AndrewVL
как сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма.
...

- оформил бы так:
public 
procedure Common_Form3; override;
  Common_Form1_Impl;
  Common_Form2_Impl;
  Common_Form3_Impl;
  Common_Base_Impl;
end
procedure Common_Form3_Impl; 
begin
// реализация
end;
19 июн 17, 18:09    [20575712]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 51468
Блог
AndrewVL
как сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма.

Попробуйте объяснить, зачем Вам такое делать. Скорее всего, Вы решаете задачу неподходящими средствами.
19 июн 17, 18:27    [20575752]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AX-Class
Member

Откуда:
Сообщений: 100
Один из вариантов декомпозиции(он же самый простой) такой:
Делаете свою виртуальную функцию статической, а нутра ее переписываете так:
procedure Foo;
begin
  BeforeFoo;
  ...
  AfterFoo;
end;

BeforeFoo и AfterFoo - виртуальные. Уже можно рулить.
procedure BeforeFoo;
begin
  inherited BeforeFoo;
  ...
  // код бежит от базового 
end;

procedure AfterFoo;
begin
  ...
  // код заканчивается базовым
  inherited AfterFoo;
end;

Если BeforeFoo, AfterFoo не достаточно, можно добавить еще
procedure Foo;
begin
  BeforeFoo;
  try
    InternalFoo;// тоже виртуальный
  finally
    AfterFoo;
  end;
end;
19 июн 17, 18:34    [20575768]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
softwarer
AndrewVL
как сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма.

Попробуйте объяснить, зачем Вам такое делать. Скорее всего, Вы решаете задачу неподходящими средствами.


Может быть. А зачем. Базовая форма открывает датасеты и настраивает форму для всех типов форм. А уже у наследованных- поднастройка. Вот и должен сначала вызываться базовый. А потом по цепочке наследования
19 июн 17, 18:41    [20575787]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
чччД,

Задумывалось так. Базовая форма делает базовые настройки. А 30 детей после базовой настройки делают свои. Как раз и делалось, чтоб н заморачиваться с function1, function2 и тд
19 июн 17, 18:43    [20575794]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
AX-Class
Один из вариантов декомпозиции(он же самый простой) такой:
Делаете свою виртуальную функцию статической, а нутра ее переписываете так:
procedure Foo;
begin
  BeforeFoo;
  ...
  AfterFoo;
end;

BeforeFoo и AfterFoo - виртуальные. Уже можно рулить.
procedure BeforeFoo;
begin
  inherited BeforeFoo;
  ...
  // код бежит от базового 
end;

procedure AfterFoo;
begin
  ...
  // код заканчивается базовым
  inherited AfterFoo;
end;

Если BeforeFoo, AfterFoo не достаточно, можно добавить еще
procedure Foo;
begin
  BeforeFoo;
  try
    InternalFoo;// тоже виртуальный
  finally
    AfterFoo;
  end;
end;


У меня вроде так и сделано. Не особо понятно почему inherited так работает
19 июн 17, 18:44    [20575796]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AX-Class
Member

Откуда:
Сообщений: 100
AndrewVL,

Тут тупо 2 разных метода.
19 июн 17, 18:44    [20575798]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AX-Class
Member

Откуда:
Сообщений: 100
AX-Class
AndrewVL,

Тут тупо 2 разных метода.

Относилось к предыдущему сообщению.
19 июн 17, 18:46    [20575803]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 51468
Блог
AndrewVL
Задумывалось так. Базовая форма делает базовые настройки. А 30 детей после базовой настройки делают свои. Как раз и делалось, чтоб н заморачиваться с function1, function2 и тд

Пока не вижу, в чём проблема, зато вижу, что это описание противоречит выше сказанному "как сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма".

Описанное делается так:

procedure TChildForm.Setup;
begin
  inherited; // сначала делаем базовые настройки
  Query.Open; // а теперь добавляем с ним свои
end;


И в чём же на самом деле вопрос?
19 июн 17, 18:55    [20575820]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
Dimitry Sibiryakov
AndrewVL
если в процедуре в форма3 ставлю сначала inherited, то переходит на код базовой формы. а
хотелось бы, чтоб на код форма2.

Значит inherited у тебя какой-то неправильной системы, поскольку у всех остальных оно
вызывает как раз метод только непосредственного предка.


Возможно.
Может так работать по той причине, что в цепочке форм форма3 форма2 форма1 базовая функция переопределена в 3,1? А в форма 2 она не переопределена? Хотя все равно должно работать все
19 июн 17, 19:29    [20575902]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
хм.

была процедура в базовом классе и в дочерних объявлена в разных секциях класса. перенес все в protected и наследование заработало
19 июн 17, 20:39    [20575977]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2100
всё наследуемое вообще лучше всего в protected и хранить.
20 июн 17, 01:02    [20576251]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
чччД
Guest
makhaon
всё наследуемое вообще лучше всего в protected и хранить.


"Чисто для своих" ?
20 июн 17, 02:40    [20576303]     Ответить | Цитировать Сообщить модератору
 Re: наследование и виртуальные методы  [new]
schi
Member

Откуда: Москва
Сообщений: 2357
makhaon
всё наследуемое вообще лучше всего в protected и хранить.


Хранить следует там, где это удобно для решения задач, и не иначе. Если нечто виртуальное используется извне, то место ему в public.
20 июн 17, 10:35    [20576664]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить