Как корректно перекрыть свойство предка?

Страдалецъ
Дата: 26.12.2019 13:00:12
В общем имеется класс:
  TCollector = class(TThread)
   private
    ACollection: TQueue<String>;
  ...
  end;
и есть наследник, где свойство ACollection предка перекрыто новым типом:
  TFileCollector = class(TCollector)
  private
    ACollection: TQueue<TFileInfo>;
  ...
  end;

constructor TCollector.Create;
begin
 inherited Create(True);
 ACollection := TQueue<String>.Create;
 ...
end;

constructor TFileCollector.Create(FilePath: String; FileMask: array of String; Options: TFileCollectorOptions);
begin
 inherited Create;
 ACollection := TQueue<TFileInfo>.Create;
 ...
end;

По идее у меня должна быть утечка памяти для TCollector.ACollection или нет?
Квейд
Дата: 26.12.2019 13:05:39
Страдалецъ
По идее у меня должна быть утечка памяти для TCollector.ACollection или нет?
Нет. Разве TCollector.ACollection не уничтожается в деструкторе TCollector?
DimaBr
Дата: 26.12.2019 13:11:23
Не увидел в коде СВОЙСТВА
Мимопроходящий
Дата: 26.12.2019 13:24:47

26.12.2019 13:00, Страдалецъ пишет:
> По идее у меня должна быть утечка памяти для TCollector.ACollection или нет?

не парься.
ты ж в деструкторе её освобождаешь (надеюсь)

Posted via ActualForum NNTP Server 1.5

softwarer
Дата: 26.12.2019 14:06:20
Страдалецъ
Как корректно перекрыть свойство предка?

Если коротко, то наиболее корректный вариант -

TCollector<T> = class(TThread)
private
  ACollection: TQueue<T>;
Polesov
Дата: 26.12.2019 14:23:33
Страдалецъ

  TCollector = class(TThread)
   private
    ACollection: TQueue<String>;
  ...
  end;
и есть наследник, где свойство ACollection предка перекрыто новым типом:
  TFileCollector = class(TCollector)
  private
    ACollection: TQueue<TFileInfo>;
  ...
  end;

У экземпляра класса TFileCollector будет свой ACollection: TQueue<TFileInfo>; и наследуемый ACollection: TQueue<String>;
Это так и должно быть?
Квейд
Дата: 26.12.2019 14:37:06
Polesov
Страдалецъ

  TCollector = class(TThread)
   private
    ACollection: TQueue<String>;
  ...
  end;
и есть наследник, где свойство ACollection предка перекрыто новым типом:
  TFileCollector = class(TCollector)
  private
    ACollection: TQueue<TFileInfo>;
  ...
  end;

У экземпляра класса TFileCollector будет свой ACollection: TQueue<TFileInfo>; и наследуемый ACollection: TQueue<String>;
Нет. Не будет. Начнем с того, что ACollection это приватное поле.
Квейд
Дата: 26.12.2019 14:42:50
А закончим тем, что без "хакерского способа" TFileCollector не получит доступ к родительскому ACollection из-за совпадения имен.
_Vasilisk_
Дата: 26.12.2019 16:05:26
Квейд
А закончим тем, что без "хакерского способа" TFileCollector не получит доступ к родительскому ACollection из-за совпадения имен.
Если все в одном модуле, то должно сработать
inherited ACollection
Polesov
Дата: 26.12.2019 16:08:06
Квейд
Нет. Не будет. Начнем с того, что ACollection это приватное поле.


Неточно выразился: экземпляр класса TFileCollector будет содержать наследуемое поле ACollection от класса TCollector.
Про доступ к наследуемому полю речи нет.

Ну, и если оба класса описаны в одном модуле, приватностью можно пренебречь:
  TCollector( Self ).ACollection;