powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / наследование и виртуальные методы
17 сообщений из 17, страница 1 из 1
наследование и виртуальные методы
    #39474266
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

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

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

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

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

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

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


Спасибо
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474272
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLесли в процедуре в форма3 ставлю сначала inherited, то переходит на код базовой формы. а
хотелось бы, чтоб на код форма2.

Значит inherited у тебя какой-то неправильной системы, поскольку у всех остальных оно
вызывает как раз метод только непосредственного предка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474336
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создана форма3.
Хочется, чтоб при вызова виртуального метода, выполнялся код дедушки->папы->свой->прадедушки
Так?
Плохое проектирование.
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474346
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVL,

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

Для базового класса
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
public 
procedure Common_Base; virtual;
  Common_Base_Impl;
end
procedure Common_Base_Impl; 
begin
// реализация
end;


Для формы 1:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
public 
procedure Common_Form1; override;
  inherited; // Вызов метода предка
  Common_Form1_Impl;
end
procedure Common_Form1_Impl; 
begin
// реализация
end;



Для формы 2:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
public 
procedure Common_Form2; override;
  inherited; // Вызов метода предка
  Common_Form2_Impl;
end
procedure Common_Form2_Impl; 
begin
// реализация
end;




Ну для форму 3, раз уж нужно
AndrewVLкак сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма.
...
- оформил бы так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public 
procedure Common_Form3; override;
  Common_Form1_Impl;
  Common_Form2_Impl;
  Common_Form3_Impl;
  Common_Base_Impl;
end
procedure Common_Form3_Impl; 
begin
// реализация
end;
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474368
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLкак сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма.
Попробуйте объяснить, зачем Вам такое делать. Скорее всего, Вы решаете задачу неподходящими средствами.
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474372
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из вариантов декомпозиции(он же самый простой) такой:
Делаете свою виртуальную функцию статической, а нутра ее переписываете так:
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Foo;
begin
  BeforeFoo;
  ...
  AfterFoo;
end;


BeforeFoo и AfterFoo - виртуальные. Уже можно рулить.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure BeforeFoo;
begin
  inherited BeforeFoo;
  ...
  // код бежит от базового 
end;

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


Если BeforeFoo, AfterFoo не достаточно, можно добавить еще
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure Foo;
begin
  BeforeFoo;
  try
    InternalFoo;// тоже виртуальный
  finally
    AfterFoo;
  end;
end;
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474379
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerAndrewVLкак сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма.
Попробуйте объяснить, зачем Вам такое делать. Скорее всего, Вы решаете задачу неподходящими средствами.

Может быть. А зачем. Базовая форма открывает датасеты и настраивает форму для всех типов форм. А уже у наследованных- поднастройка. Вот и должен сначала вызываться базовый. А потом по цепочке наследования
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474383
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Задумывалось так. Базовая форма делает базовые настройки. А 30 детей после базовой настройки делают свои. Как раз и делалось, чтоб н заморачиваться с function1, function2 и тд
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474384
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AX-ClassОдин из вариантов декомпозиции(он же самый простой) такой:
Делаете свою виртуальную функцию статической, а нутра ее переписываете так:
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Foo;
begin
  BeforeFoo;
  ...
  AfterFoo;
end;


BeforeFoo и AfterFoo - виртуальные. Уже можно рулить.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure BeforeFoo;
begin
  inherited BeforeFoo;
  ...
  // код бежит от базового 
end;

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


Если BeforeFoo, AfterFoo не достаточно, можно добавить еще
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure Foo;
begin
  BeforeFoo;
  try
    InternalFoo;// тоже виртуальный
  finally
    AfterFoo;
  end;
end;



У меня вроде так и сделано. Не особо понятно почему inherited так работает
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474386
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVL,

Тут тупо 2 разных метода.
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474389
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AX-ClassAndrewVL,

Тут тупо 2 разных метода.
Относилось к предыдущему сообщению.
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474395
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLЗадумывалось так. Базовая форма делает базовые настройки. А 30 детей после базовой настройки делают свои. Как раз и делалось, чтоб н заморачиваться с function1, function2 и тд
Пока не вижу, в чём проблема, зато вижу, что это описание противоречит выше сказанному "как сделать в данном случае такую последовательность выполнения. форма1-форма2-форма3-базовая форма".

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

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



И в чём же на самом деле вопрос?
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474418
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAndrewVLесли в процедуре в форма3 ставлю сначала inherited, то переходит на код базовой формы. а
хотелось бы, чтоб на код форма2.

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


Возможно.
Может так работать по той причине, что в цепочке форм форма3 форма2 форма1 базовая функция переопределена в 3,1? А в форма 2 она не переопределена? Хотя все равно должно работать все
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474437
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм.

была процедура в базовом классе и в дочерних объявлена в разных секциях класса. перенес все в protected и наследование заработало
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474516
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё наследуемое вообще лучше всего в protected и хранить.
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474528
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonвсё наследуемое вообще лучше всего в protected и хранить.

"Чисто для своих" ?
...
Рейтинг: 0 / 0
наследование и виртуальные методы
    #39474614
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonвсё наследуемое вообще лучше всего в protected и хранить.

Хранить следует там, где это удобно для решения задач, и не иначе. Если нечто виртуальное используется извне, то место ему в public.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / наследование и виртуальные методы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]