Delphi: Когда вновь появляются шкуры предков и когда они показывают их?
сегодня Недавно на Stackoverflow я узнал, что:
реинтродукция используется дляскрывать конструкторы предковреинтродукция используется дляшоу конструкторы предковЯ пытался разобраться во всем этом, так что вот еще один, очень специфический вопрос,поддерживая мой главный вопрос, касающийся конструкторов.
Обновить: заменил весь вопрос:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
При создании TCellPhone доступны 3 конструктора:
Кубок: целое числоКубок: целое число; Чайник: строка[Чайник: Строка = '']Вопрос: почемуconstructor(Teapot: string='')
не быть скрытым?
Теперь я добавил третьего потомка:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override;
end;
При строительствеTiPhone
четыре Конструкторы доступны:
Почему тамчетыре Конструкторы? я переиграл одну из существующих трех.Редактировать: Это может быть ошибкой в проницательности кода, она показывает мне четыре - но как я могу тогда звонить, когда два одинаковы.
Используя оригинальный код снова:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
уже известно, чтоTCellPhone
имеет три конструктора:
Как я могу изменить декларациюTCellPhone
скрыть конструктор предка? например чтобы:
TNokia = class(TCellPhone)
end;
будет иметь только два конструктора:
Кубок: целое числоКубок: целое число; Чайник: строкаТеперь для случая, когдаreintroduce
используется, чтобы скрыть не виртуального предка. В предыдущем случаеTiPhone
имеет четыре конструктора (в идеале было бы только два - сTComputer
как-то скрывает своего предка). Но даже если я не могу исправитьTComputer
, я могу изменитьTiPhone
иметь только один:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce;
end;
СейчасTiPhone
имеет только один конструктор:
Повторное введение обычно используется только для подавления предупреждения о сокрытиивиртуальный предки. В этом случае:
Create(Teapot: string = '')
не виртуальный - все же я все еще могу использовать повторный ввод, чтобы скрыть это.
Носейчас, если я добавлю еще один перегруженTiPhone
:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); overload;
end;
Затем внезапно возвращаются (ранее скрытые) предки:
TiPhone.Create (7);TiPhone.Create ( 'розовый');TiPhone.Create (7, «розовый»);TiPhone.Create ();Как вы видите, я изо всех сил пытаюсь понять логику
когда что-то скрытокак спрятать что-токогда что-то показанокак показать что-то