Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Переопределение метода в хелпере / 2 сообщений из 2, страница 1 из 1
04.10.2018, 19:46
    #39713237
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение метода в хелпере
Есть такой набор классов
Код: 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.
TBase = class
  function Test: string; virtual;
end;

TBaseChild = class(TBase)
  function Test: string; override;
end;

TChild1 = class(TBaseChild)
  function Test: string; override;
end;

TChild2 = class(TBaseChild)
  function Test: string; override;
end;

function TBase.Test: string; 
begin
  Result := 'TBase';
end;

function TBaseChild.Test: string; 
begin
  Result := 'TBaseChild';
end;

function TChild1.Test: string; 
begin
  Result := 'TChild1';
end;

function TChild2.Test: string; 
begin
  Result := 'TChild2';
end;

Для модификации классы недоступны. Мне нужно переопределить метод в классе TChild1. Пишу
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
TBaseChildHelper = class helper for TBaseChild
  function Test: string;
end;

function TBaseChildHelper.Test: string;
begin
  if Self is TChild1 then
    Result := 'TBaseChildHelper Child1'
  else
    Result := inherited Test;
end;

и вызов
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  Obj: TBaseChild;
  Str: string;
begin
   ..........
  Str := Obj.Test;
end;

Проблема в строчке
Код: pascal
1.
Result := inherited Test;


Для всех классов отличных от TChild1 вызывается метод TBase.Test, а нужно вызвать метод своего класса.

Если написать так
Код: pascal
1.
Result := Self.Test;

то рекурсия и стек оверфлоу.

Можно придумать выход из ситуации?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
04.10.2018, 20:06
    #39713243
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение метода в хелпере
Вывернулся вот так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
TBaseChildBaseHelper = class helper for TBaseChild
private
  function ObjTest: string;
end;

TBaseChildHelper = class helper(TBaseChildBaseHelper) for TBaseChild
  function Test: string;
end;

function TBaseChildBaseHelper.ObjTest: string;
begin
  Result := Test;  // Вызываем метод класса
end;

function TBaseChildHelper.Test: string;
begin
  if Self is TChild1 then
    Result := 'TBaseChildHelper Child1'
  else
    Result := ObjTest;
end;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Переопределение метода в хелпере / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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