Конференция "Начинающим" » обращение к property предка из метода потомка
 
  • KSergey © (12.02.18 09:08) [0]
    Напомните, пожалуйста, как такие задачи решаются. Что-то подзабыл я.
    Ниже пример чисто схематичный, чтобы показать суть вопроса.

    Пусть есть класс предок:
    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) Предок - не мой, править его код возможности нет.
  • sniknik © (12.02.18 10:27) [1]
    во втором модуле опиши "хаккласс" типа
    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
  • sniknik © (12.02.18 11:57) [3]
    > Вы, сударь, ерунду говорите
    если "ерунда" работает, то не такая уж это ерунда?

    хотя, да, "хак" лишний, хоть и работает можно просто TClass1(self).Data;

    > вычисляется указатель на нужную область памяти и получается доступ.
    ... смысл? ему же нужно к публичному Data предка, а не к приватному FData.
  • KSergey © (12.02.18 12:21) [4]
    > sniknik ©   (12.02.18 11:57) [3]
    > > Вы, сударь, ерунду говорите
    > если "ерунда" работает, то не такая уж это ерунда?

    Я так понимаю речь про небольшую описку:

    THakClass1(self).FData;
  • sniknik © (12.02.18 12:59) [5]
    > 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 это всю жизнь и делалось
 
Конференция "Начинающим" » обращение к property предка из метода потомка
Есть новые Нет новых   [118478   +40][b:0][p:0.001]