Я хотел бы добавить это как комментарий к ответу Роба Кеннеди, но так как я не могу, я иду ..
Все время нет никаких предупреждений о сокрытии конструкторов предков.
Просто потому, что вы этого не делаете.
Если я скрываю предка, почему нет предупреждения?у меня нет повторного введения.
Опять же, просто потому, что вы ничего не скрываете.
Вы видели доказательство того, что вы ничего не скрывали.Это 3 доступных конструктора, которые вы проверили как доказательство.
Почему повторное введение может использоваться для сокрытия предка?
Как упоминал Роб, повторное введение просто подавляетподсказка / предупреждение компилятора.В этом слове нет никакой реальной техники.Таким образом, вы ничего не скрываете при повторном введении.
Я бы хотел подумать о том, как скрыться, но я согласен с Сертаком, сначала я должен знать, как вы в этом случае скрываетесь.
Редактировать: Я только что прочитал сообщения, которые вы упомянули, я думаю, вы неправильно поняли концепции.Вот мое краткое объяснение.
Повторное введение используется для сокрытия конструкторов предков
Ответ этого поста не указывает на это.Тот, который действительно скрывает конструктор предка, это НОВЫЙ КОНСТРУКТОР потомка с тем же параметром, что и у предка.Ключевое слово reintroduce просто подавляет предупреждение компилятора.
reintroduce используется для показа конструкторов предков
В ответе на этот пост это ПЕРЕГРУЗКАключевое слово, которое делает конструктор предка по-прежнему доступным.
ДОПОЛНЕНИЕ в ответ на вопрос Яна в его комментарии ниже:
Первый шаг, чтобы решить вашу путаницу, - это выявить реальные проблемы.Если мы внимательно изучим ваши сообщения, станет очевидно, что вы на самом деле хотели решить две проблемы за один шаг.Две проблемы:
- Чтобы скрыть конструктор предка с определенным именем
- Чтобы иметь несколько конструкторов с одинаковым именем в потомке.
Хотя ониМогут показаться простыми проблемы, но тщательный осмотр сразу же поразит вашу голову, что их натуры точно противоположны друг другу.Задача 1 хочет скрыть метод / конструктор, в то время как задача 2 хочет показать не только один, но несколько методов / конструкторов.Так что если вы смешаете их вместе за один шаг , они определенно уничтожат друг друга.Неудивительно, что они вызывают у вас головную боль ...:)
Основное правило для решения этих двух проблем - не смешивать их за один шаг.Это означает, что нам нужен промежуточный класс для решения задачи 1 и перегрузки потомков этого промежуточного класса.Примерно так:
type
TComputer = class(TObject)
private
FCaller: TConstructorCaller;
public
constructor Create(Teapot: string=''); virtual;
property Caller: TConstructorCaller read FCaller;
end;
TBaseCellphone=class(TComputer)
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TBaseCellphone)
protected
public
constructor Create(Cup: Integer); overload; override;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); reintroduce; overload;
end;
Из приведенного выше кода TBaseCellphone является промежуточным классом.В этом сценарии его задача состоит только в том, чтобы скрыть конструктор Create of TComputer.Обратите внимание, что вы НЕ ДОЛЖНЫ использовать ключевое слово перегрузки здесь, иначе скрытие будет отменено.Теперь, когда скрытие завершено, теперь вы можете свободно спамить ключевое слово перегрузки в его потомках, чтобы получить несколько конструкторов с одинаковыми именами.
Чтобы проверить, вы видите, что следующий код не будет компилироваться:
TCellPhone.Create('My Teapot');