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 конструктора:

  • Cup: Integer
  • Cup: Integer; Чайник: шнур
  • [Чайник: String = '']

Вопрос: Почему конструктор (Чайник: 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 доступны четыре конструктора:

  • Cup: Integer
  • Cup: Integer
  • Cup: Integer; Чайник: шнур
  • [Чайник: string = '']

Почему четыре конструктора? я перекрыл один из трех существующих. Изменить: Это может быть ошибка в 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 имеет три конструктора:

  • Cup: Integer
  • Cup: Integer; Чайник: шнур
  • [Teapot: String = '']

Как мне изменить объявление TCellPhone , чтобы скрыть конструктор предка? например, так что:

TNokia = class(TCellPhone)
end;

будет иметь только два конструктора:

  • Cup: Integer
  • Cup: Integer; Чайник: строка

Теперь рассмотрим случай, когда повторно ввести , чтобы скрыть невиртуального предка. В предыдущем случае 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

Reintroduce обычно используется только для подавления предупреждения о скрытии виртуальных предков. В таком случае:

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 ();

Как видите, я изо всех сил пытаюсь понять логику

  • , когда что-то скрыто
  • как скрыть что-то
  • , когда что-то показано
  • как показать что-то

6
задан Community 23 May 2017 в 11:43
поделиться