Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Дополнение в дочернем классе метода родительского  [new]
тгз
Guest
Здравствуйте. Такой вопрос. Есть класс с определенным методом, дополняющим метод родителя. Структура такая:

TParent = class
    function func();

TChild = class(TParent)
    function func();

...

function TChild.func();
begin
    result := inherited;
end;


Внутри этого метода родительский класс перебирает все свойства объекта (через RTTI) и выполняет некоторые действия в зависимости от типа свойства. Некоторые типы там не рассмотрены, они появляются только в дочернем классе, и в каждом из дочерних могут появляться свои.

Нужно сделать так, чтобы дочерний класс обработал все свойства, пропущенные родительским классом. Как это можно реализовать?
1 окт 18, 20:35    [21691845]     Ответить | Цитировать Сообщить модератору
 Re: Дополнение в дочернем классе метода родительского  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
тгз,

инхеритед + до-обработка?
1 окт 18, 20:46    [21691863]     Ответить | Цитировать Сообщить модератору
 Re: Дополнение в дочернем классе метода родительского  [new]
тгз
Guest
Да, inherited - это понятно. А вот с "до-обработкой" проблемы. Как понять, какие свойства не были обработаны родительским классом?
1 окт 18, 21:11    [21691894]     Ответить | Цитировать Сообщить модератору
 Re: Дополнение в дочернем классе метода родительского  [new]
тгз
Guest
Понял, "до-обработка" - это обработка дочерним классом до вызова "inherited", правильно? Тогда в каждом из родительских классов получать список свойств заново и обрабатывать только те, которые данный класс может обработать? Не будет слишком дорогой операцией получение каждый раз этого списка?
1 окт 18, 21:30    [21691914]     Ответить | Цитировать Сообщить модератору
 Re: Дополнение в дочернем классе метода родительского  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
тгз
Понял, "до-обработка" - это обработка дочерним классом до вызова "inherited", правильно? Тогда в каждом из родительских классов получать список свойств заново и обрабатывать только те, которые данный класс может обработать? Не будет слишком дорогой операцией получение каждый раз этого списка?

1. Помечай, флажки ставь.
2. Кому какое дело, кроме тебя, дорогая ли "эта" операция, или нет?
1 окт 18, 22:05    [21691933]     Ответить | Цитировать Сообщить модератору
 Re: Дополнение в дочернем классе метода родительского  [new]
типа юзер
Guest
тгз
...выполняет некоторые действия в зависимости от типа свойства. Некоторые типы там не рассмотрены, они появляются только в дочернем классе, и в каждом из дочерних могут появляться свои.

Нужно сделать так, чтобы дочерний класс обработал все свойства, пропущенные родительским классом. Как это можно реализовать?
очевидно же - в дочернем обрабатывать свойства тех типов, которые в нем и появляются.
если в дочернем добавлены свойства типов "рассматриваемых" родительским - родительский же их увидит через RTTI и обработает, разве нет?
1 окт 18, 22:42    [21691955]     Ответить | Цитировать Сообщить модератору
 Re: Дополнение в дочернем классе метода родительского  [new]
DimaBr
Member

Откуда:
Сообщений: 10781
тгз
Нужно сделать так, чтобы дочерний класс обработал все свойства, пропущенные родительским классом. Как это можно реализовать?

Составить список свойств (TStringList) и помечать обработанные свойства флажком integer(TStringList.Object[i]) := 1;
Соответственно, обработанные более не обрабатывать
1 окт 18, 22:53    [21691957]     Ответить | Цитировать Сообщить модератору
 Re: Дополнение в дочернем классе метода родительского  [new]
delphinotes
Member

Откуда: Санкт-Петербург
Сообщений: 308
тгз,

Я так понял, что для каждого свойства может быть своя функция.. и раз RTTI уже используется, то попробуй использовать атрибуты.
Атрибутами можно помечать свойства, которые надо обрабатывать. Атрибуты могут быть параметризованными, например иметь ссылку на процедуру обработки.
2 окт 18, 14:53    [21692745]     Ответить | Цитировать Сообщить модератору
 Re: Дополнение в дочернем классе метода родительского  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10643
TParent = class
    function func(): Boolean;  virtual;

TChild = class(TParent)
    function func(): Boolean; override;

...

function TChild.func(): Boolean;
begin
  result := inherited func();
  if not result then begin
    // Дообработка
  end;
end;
2 окт 18, 15:32    [21692824]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить