-
Напомните, пожалуйста, как такие задачи решаются. Что-то подзабыл я.
Ниже пример чисто схематичный, чтобы показать суть вопроса.
Пусть есть класс предок:TClass1 = class
private
FData: String;
public
property Data: String read FData write FData;
end;
И есть класс потомок (в другом модуле!!):TClass2 = class(TClass1)
public
property Data: String read GetData write SetData;
end;
function TClass2.GetData(): String;
begin
Result := 'Calss2' + TClass1.Data; // вот тут хочется получить значение свойства Data от предка
end;
Конечно, запись TClass1.Data - некорректна.
Вопрос в том, как это сделать?
Условия, которые обойти я не в силах:
1) Виртуальных методов GetData / SetData в предке нет.
2) Модули разные, т.е. по простому к private-части не подступиться, да и не хотелось бы закладываться на реализацию обращаться именно к property Data предка.
3) Предок - не мой, править его код возможности нет. -
во втором модуле опиши "хаккласс" типаimplementation
type
THakClass1 = class(TClass1);
используй
unction TClass2.GetData(): String;
begin
Result := 'Calss2' + THakClass1(self).Data;
end;
вроде так -
Игорь Шевченко © (12.02.18 10:59) [2]sniknik © (12.02.18 10:27) [1]
Вы, сударь, ерунду говорите
KSergey © (12.02.18 09:08)
> Напомните, пожалуйста, как такие задачи решаются.
Никак такие задачи не решаются, но если очень хочется странного, то вычисляется смещение до нужного поля с учетом опций компиляции (выравнивание в частности), по этому смещению вычисляется указатель на нужную область памяти и получается доступ. Как сделать в деталях, смотрится в TypInfo.pas -
> Вы, сударь, ерунду говорите
если "ерунда" работает, то не такая уж это ерунда?
хотя, да, "хак" лишний, хоть и работает можно просто TClass1(self).Data;
> вычисляется указатель на нужную область памяти и получается доступ.
... смысл? ему же нужно к публичному Data предка, а не к приватному FData. -
> sniknik © (12.02.18 11:57) [3]
> > Вы, сударь, ерунду говорите
> если "ерунда" работает, то не такая уж это ерунда?
Я так понимаю речь про небольшую описку:
THakClass1(self).FData; -
> THakClass1(self).FData;
не, вот так скорее всего не получится. так придется адрес вычислять. -
Юрий Зотов © (12.02.18 13:35) [6]Т.к. к полю FData есть прямой доступ, то его адрес можно не вычислять, а получить сразу:
@Data - даст адрес FData -
Юрий Зотов © (12.02.18 13:38) [7]Но сначала я бы попробовал так:
Result := 'Calss2' + (inherited Data); -
Игорь Шевченко © (12.02.18 13:49) [8]
> если "ерунда" работает, то не такая уж это ерунда?
Извиняюсь, не заметил публичной property в оригинальном коде. -
Внук © (12.02.18 19:35) [9]Именно через inherited это всю жизнь и делалось