Сегодня Недавно в 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 конструктора:
Вопрос: Почему конструктор (Чайник: 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
доступны четыре конструктора:
Почему четыре конструктора? я перекрыл один из трех существующих. Изменить: Это может быть ошибка в code-insight, он показывает мне четыре - но как я могу тогда позвонить, когда двое совпадают.
Повторное использование исходного кода:
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;
будет иметь только два конструктора:
Теперь рассмотрим случай, когда повторно ввести
, чтобы скрыть невиртуального предка. В предыдущем случае 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
имеет только один конструктор:
Reintroduce обычно используется только для подавления предупреждения о скрытии виртуальных предков. В таком случае:
Create(Teapot: string = '')
не виртуальный, но я все еще могу использовать повторное введение, чтобы скрыть его.
Но сейчас , если я добавлю еще один перегруженный в TiPhone
:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); overload;
end;
Затем внезапно появится (ранее скрытые) предки возвращаются:
Как видите, я изо всех сил пытаюсь понять логику