powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / общий код для классов
12 сообщений из 12, страница 1 из 1
общий код для классов
    #39680646
sergeyguest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как сделать что-то подобное?
из класса 1 наследовать класс 2 с частью общего кода в (одноимённой) процедуре.
вызов функции из цикла не предлагать, т.к., затраты на вызов функции слишком велики. и даже если бы, то как бы это выглядело с точки зрения наследования, и из класса 2? (всё равно не предлагать)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
type TClass1=class
  procedure DoSomething;
end;
procedure TClass1.DoSomething;
begin
базовый код
цикл begin
  базовый код в цикле
  базовый код в цикле
цикл end
базовый код
end;

type TClass2=class(TClass1)
  procedure DoSomething;
end;
procedure TClass2.DoSomething;
begin
базовый код - эти строки должны наследоваться от Class1
цикл begin
  базовый код в цикле
  здесь код дочернего метода
  базовый код в цикле
цикл end
базовый код
end;
...
Рейтинг: 0 / 0
общий код для классов
    #39680647
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
type TClass1=class
  procedure DoSomething;
  procedure InTheMiddle(); virtual; 
end;
procedure TClass1.DoSomething;
begin
базовый код
цикл begin
  базовый код в цикле
  InTheMiddle();
  базовый код в цикле
цикл end
базовый код
end;
procedure TClass1.InTheMiddle;
begin
end;

type TClass2=class(TClass1)
  procedure InTheMiddle(); override; 
end;
procedure TClass2.InTheMiddle();
begin
  writeln('Привет, Лошарик!')
end;


PS: Я ничего не предлагал.
...
Рейтинг: 0 / 0
общий код для классов
    #39680656
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Найти и прочитать:

https://www.ozon.ru/context/detail/id/3905587/
...
Рейтинг: 0 / 0
общий код для классов
    #39680905
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__
Код: pascal
1.
2.
3.
4.
type TClass1=class
  procedure DoSomething;
  procedure InTheMiddle(); virtual; 
end;


PS: Я ничего не предлагал.
Поправлю, чтобы учесть пожелание не вызывать функцию
[quot чччД__]
Код: pascal
1.
2.
3.
4.
type TClass1=class
  procedure DoSomething;
  procedure InTheMiddle(); inline; 
end;
...
Рейтинг: 0 / 0
общий код для классов
    #39680924
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimonkaПоправлю, чтобы учесть пожелание не вызывать функцию
Код: pascal
1.
2.
3.
4.
type TClass1=class
  procedure DoSomething;
  procedure InTheMiddle(); inline; 
end;


inline функции не могут быть виртуальными, AFAIR, так что не взлетит.
...
Рейтинг: 0 / 0
общий код для классов
    #39680981
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-правильному - вариант из #2.
Если вызов функции ну совсем-совсем неприемлем, то выделять куски кода в include и подключать их по мере надобности
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TClass2.DoSomething;
begin
{$I 'базовый код1.inc'}
цикл begin
  {$I 'базовый код в цикле1.inc'}
  здесь код дочернего метода
  {$I 'базовый код в цикле2.inc'}
цикл end
{$I 'базовый код2.inc'}
end;


Но это если совершенно с функцией никак.
...
Рейтинг: 0 / 0
общий код для классов
    #39681020
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полагаю, что мнение " затраты на вызов функции слишком велики " сильно преувеличено. Иначе, зачем классы. Копипаста/инлайн только, и долго курим, как убрать еще пару тиков кпу.
...
Рейтинг: 0 / 0
общий код для классов
    #39681092
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всякое бывает. Может, у него там квинтиллиард итераций.
...
Рейтинг: 0 / 0
общий код для классов
    #39681166
527470
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно попробовать то что предлагали подключать через {$I} вынести в процедуры/функции с указанием inline. Чисто теоритически должно получиться то же самое по выходному бинарнику. Будет нагляднее в редакторе, но отладка будет хуже (инлайновые функции не пройти пошагово в дебагере, в отличии от {$I}) + оптимизация inline у делфи иногда страдает.
...
Рейтинг: 0 / 0
общий код для классов
    #39681257
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
527470Чисто теоритически должно получиться то же самое по выходному бинарнику
чисто теоретически можно любую фнукцию проинлайнить компилятором автоматически...

а вот на практике у Дельфи инлайн-функции всё-равно параметры и большие результаты через стэк передают, и этот дополнительный код никуда не исчезнет.

Legacy-compatibility на inline-функциях в XE2:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Main.pas.49: lblJvIPAddressValuesAddress.Caption := IntToStr(AddressValues.Address);
00563B20 8B45F8           mov eax,[ebp-$08]
00563B23 8945E0           mov [ebp-$20],eax
00563B26 8B45E0           mov eax,[ebp-$20]
00563B29 8945F4           mov [ebp-$0c],eax
00563B2C 8B45F4           mov eax,[ebp-$0c]
...
Main.pas.50: lblJvIPAddressValuesValue1.Caption := IntToStr(AddressValues.Value1);
00563B52 8B45F8           mov eax,[ebp-$08]
00563B55 8945DC           mov [ebp-$24],eax
00563B58 8B45DC           mov eax,[ebp-$24]
00563B5B 8945F0           mov [ebp-$10],eax
00563B5E 8B45F0           mov eax,[ebp-$10]
00563B61 8945D4           mov [ebp-$2c],eax
00563B64 8B45D4           mov eax,[ebp-$2c]
00563B67 BA04000000       mov edx,$00000004
....




Василий 2Всякое бывает. Может, у него там квинтиллиард итераций.
....и все данные влезают в L1 cache
...
Рейтинг: 0 / 0
общий код для классов
    #39681537
Guest2013
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergeyguest,
такое не подойдет?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
type 
TmyProc = procedure(aI: Integer; var aDone: Boolean) of class;

TMyClass1=class
public
  procedure DoSomething(aMyProc: TmyProc=nil); virtual;
end;

TMyClass1.DoSomething(aMyProc: TmyProc);
var
  isDone: Boolean;
  i: integer;
begin
  isDone := False;
  for i := 0 to 100000 do
  begin
    if Assigned(aMyProc) then AMyProc(I, isDone);
    if isDone then Break;
  end;
end;

TMyClass2=class(TMyClass1)
private
  procedure MyProc2(aI: Integer; var aDone: Boolean);
public
  procedure DoSomething; override;
end;

TMyClass2.MyProc2(aI: Integer; var aDone: Boolean);
begin
  {тут что-то делаем}
end;

TMyClass2.DoSomething;
begin
  inherited DoSomething(MyProc2)
end;
...
Рейтинг: 0 / 0
общий код для классов
    #39681763
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно просто скопировать код из базового метода, разбавив его своим.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / общий код для классов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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