Я создал следующий класс, после прочтения о значительном улучшении производительности TDictionary над TStringList:как вызвать унаследованный конструктор TObjectDictionary в Delphi
TAnsiStringList = class(TObjectDictionary<AnsiString,TObject>)
public
constructor Create(const OwnsObjects: Boolean = True); reintroduce;
destructor Destroy; override;
procedure Add(const AString: AnsiString);
procedure AddObject(const AString: AnsiString; AObject: TObject);
end;
Я закодировал конструктор так:
{ TAnsiStringList }
constructor TAnsiStringList.Create(const OwnsObjects: Boolean = True);
begin
if OwnsObjects then
inherited Create([doOwnsKeys,doOwnsValues])
else
inherited Create;
end;
... ожидая, что этот конструктор TObjectDictionary будет называться:
constructor Create(Ownerships: TDictionaryOwnerships; ACapacity: Integer = 0); overload;
... если указан параметр Ownerships. Если домовладений параметр не указан, я ожидал, что следующий унаследовали TDictionary конструктор будет называться:
constructor Create(ACapacity: Integer = 0); overload;
код компилируется и работает, но когда я называю
inherited Create([doOwnsKeys,doOwnsValues]) I get the following error:
Недопустимый класс типаж
Кто-нибудь видит, что я делаю неправильно, и есть ли способ сделать это?
ТИА
Спасибо за быстрый ответ. Причина, по которой я использовал этот подход, - это просто улучшение производительности при выполнении поиска в больших списках. Я часто использовал строковый список как текстовую систему индексирования в списках объектов.Если мне не нужно искать строку или объект с помощью числового индекса, почему бы не лучше использовать TObjectDictionary, так как это намного быстрее при поиске? – DelphiCoder
Вы можете просто использовать 'TObjectDictionary' как есть. Если вам нужна версия, которая явно заставляет ваш выбор владения и выбирает «AnsiString» для ключей, по крайней мере, оставить параметр типа параметризованным. Тогда вы можете иметь безопасность типа. Вы можете обнаружить, что производительность хуже с помощью AnsiString. Если вы не используете 'AnsiString' везде и не трогаете методы RTL/VCL, которые будут конвертироваться в UTF-16 и из него. –
* Если мне не нужно искать строку или объект с помощью числового индекса * Это нормально. Это мой последний абзац. Но тогда ваше имя класса ошибочно. Каждый кодер Delphi, который читает 'TAnsiStringList', будет считать упорядоченный массив, подобный контейнеру. –