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

Откуда: Украина, Харьков
Сообщений: 10578
Есть такой набор классов
+
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. Пишу
+
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;
и вызов
var
  Obj: TBaseChild;
  Str: string;
begin
   ..........
  Str := Obj.Test;
end;
Проблема в строчке
Result := inherited Test;

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

Если написать так
Result := Self.Test;
то рекурсия и стек оверфлоу.

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

С уважением, Vasilisk
4 окт 18, 19:46    [21695736]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение метода в хелпере  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10578
Вывернулся вот так

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;
4 окт 18, 20:06    [21695754]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить