Сегодня
Недавно на Stackoverflow я узнал, что:Delphi: Когда повторно вводит скрытых предков и когда они показывают их?
я пытался разобраться во всем этом, так вот еще один, очень конкретный вопрос , supporting my main question dealing with constructors.
Update: заменить весь вопрос:
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 Конструкторы В комплекте:
- Cup: Integer
- Cup: Integer; Чайник: строка
- [чайник: String = '']
Вопрос: Почему constructor(Teapot: string='')
не скрыт?
Теперь я добавил 3-й потомок:
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
четыре Конструкторы доступны:
- Cup: Integer
- Cup: Integer
- Кубок: целое; Чайник: строка
- [чайник: строка = '']
Почему там четыре конструкторы? я перевернул одну из существующих трех. Редактировать: Это может быть ошибка в понимании кода, это показывает мне четыре - но как я могу позвонить тогда, когда два одинаковые.
Используя исходный код еще раз:
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
имеет три конструктора:
- Cup: Integer
- Cup: Integer; Чайник: строка
- [чайник: String = '']
Как я изменить декларацию TCellPhone
, чтобы скрыть конструктор предка? например так что:
TNokia = class(TCellPhone)
end;
будет иметь только два конструктора:
- Cup: Integer
- Cup: Integer; Чайник: строка
Теперь для случая, когда 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
имеет только один конструктор:
- Cup: Integer
реинтродукции обычно используется только для подавления предупреждения о скрытии виртуальных предков. В этом случае:
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 ('pink');
- TiPhone.Create (7, 'pink');
- TiPhone.Создайте();
Как вы можете видеть, я изо всех сил пытаюсь понять логику
- когда что-то скрыто
- как скрыть что-то
- когда что-то показано
- как показать что-то
@Ian: Вы действительно задаете много вопросов сегодня! Ницца! –
Вы действительно говорите, что можете скомпилировать run 'obj: = TCellPhone.Create ('foo')'? Я нахожу это удивительным. –
Я, конечно, выполнил полный пример, используя это определение. К счастью, у нас уже есть ответ ниже. –