Как изменить ItemClass класса, унаследованного от TCollection

У меня есть класс, который унаследован от TCollection (давайте назовем его "TMyCollection"), и я должен унаследовать новый класс от него (давайте назовем его "TMyItems")

Обычно мы передаем тип ItemClass в конструктор TCollection, но в моем случае конструктор TMyCollection переопределяется новым конструктором, который не принимает ItemClass и принимает только Owner.

Мне нужно знать, как изменить ItemClass в "TMyItems", если унаследованный конструктор не принимает параметр ItemClass.

С уважением.

1 ответ

Решение

Вы все еще можете вызвать унаследованный TCollection.Create из подкласса, даже если он не имеет той же подписи:

  TMyCollectionItem = class(TCollectionItem)
  private
    FIntProp: Integer;
    procedure SetIntProp(const Value: Integer);
  public
    property IntProp: Integer read FIntProp write SetIntProp;
  end;

  TMyCollection = class(TCollection)
  public
    constructor Create(AOwner: TComponent);virtual;
  end;

{ TMyCollection }

constructor TMyCollection.Create(AOwner: TComponent);
begin
  inherited Create(TMyCollectionItem); // call inherited constructor
end;

РЕДАКТИРОВАТЬ:

Согласно комментариям оригинального автора, "хитрость" - пометить новый конструктор как перегруженный. Поскольку это перегрузка, она не скрывает доступ к конструктору TCollection.

  TMyCollection = class(TCollection)
  public
    constructor Create(AOwner: TComponent);overload;  virtual;
  end;

  TMyItem = class(TCollectionItem)
  private
    FInt: Integer;
  public
    property Int: Integer read FInt;
  end;

  TMyItems = class(TMyCollection)
  public
    constructor Create(AOwner: TComponent);override;
  end;

implementation

{ TMyCollection }

constructor TMyCollection.Create(AOwner: TComponent);
begin
  inherited Create(TCollectionItem);

end;

{ TMyItems }

constructor TMyItems.Create(AOwner: TComponent);
begin
  inherited Create(TMyItem);
  inherited Create(AOwner); // odd, but valid
end;

end.
Другие вопросы по тегам