Прежде всего, как объясняет @Cosmin в некоторых деталях, вопрос не касается переопределенных методов. Вопрос в том, чтобы вызвать унаследованные методы.
inherited Create;
- лучшее, что вы можете здесь сделать. Это вызывает конструктор TDictionary<TKey,TValue>
, передавая по умолчанию ACapacity
из 0
.
На самом деле, может быть даже предпочтительнее написать:
inherited Create(0);
и будьте вполне явными.
Я предполагаю, что ваш код выглядит следующим образом:
type
TMyClass<TKey,TValue> = class(TDictionary<TKey,TValue>)
public
constructor Create;
end;
constructor TMyClass<K,V>.Create;
begin
inherited;
end;
Я прочитал документацию для унаследованного ключевого слова, пытаясь понять разницу между inherited
и inherited Create
. Лучшие подсказки содержатся в следующих выдержках:
Если за унаследованным следует имя члена, это представляет обычный вызов метода ...
и
Когда унаследовано не имеет идентификатора после него, оно ссылается на унаследованный метод с тем же именем, что и метод вложения. В этом случае унаследованный не принимает явных параметров, но передает унаследованному методу те же параметры, с которыми был вызван включающий метод.
Кажется, это указывает на то, что два конкурирующих использования inherited
трактуются по-разному.
Насколько я понимаю, inherited
приводит к вызову конструктора с соответствием параметрам. В вашем случае, TMyClass<K,V>.Create
не имеет параметров, поэтому единственный соответствующий конструктор - это TObject
. Обратите внимание, что ни один из конструкторов TDictionary
не может совпадать, поскольку все они принимают параметры.
С другой стороны, когда вы пишете inherited Create
, это обычный вызов метода. И поэтому параметры по умолчанию могут быть добавлены к вызову метода. Важным моментом является то, что этот вариант позволяет вызывать унаследованные методы с несоответствующими списками параметров.
На мой взгляд, синтаксис inherited
без следующего идентификатора должен был быть зарезервирован для виртуальных методов.
Дизайнеры TDictionary<TKey,TValue>
могли бы спасти вас от этой несчастной судьбы. Конструкторы TDictionary<TKey,TValue>
должны были быть реализованы так:
constructor Create; overload;
constructor Create(ACapacity: Integer); overload;
.....other constructors omitted
Тогда реализация для конструктора без параметров будет просто:
constructor TDictionary<TKey,TValue>.Create;
begin
Create(0);
end;
Если бы это решение было принято, конструктор без параметров, объявленный в TObject
, был бы скрыт от любых производных классов, и ваш код работал бы так, как вы хотели.
Проблема, с которой вы здесь столкнулись, является результатом несчастного слияния событий, связанных с перегрузкой, параметрами по умолчанию, конструктором без параметров TObject
и необычным синтаксисом inherited
для конструкторов. Хотя запись inherited
очень удобочитаема и лаконична, она просто приводит к путанице, когда перегруженные методы находятся в игре.