Delphi: Как скрыть конструкторы предков?

Обновить: распустил вопрос на более простом примере, на который изначально не был принят ответ

Дан следующий класс и его предок:

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 видимых конструктора:

Кубок: целое числоКубок: целое число; Чайник: строкаЧайник: строка = ''

Что мне делать, чтобыTCellPhone так что конструктор предка (Teapot: string = '') не видно, оставляя только заявленные конструкторы:

Кубок: целое числоКубок: целое число; Чайник: строка

Заметка: Обычно простой актимеющий конструктор-потомок скрывает предка:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); virtual;
end;
Кубок: целое число

И если выв розыске чтобы сохранить и конструктор предка, и потомка, вы бы пометили потомка какoverload:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
end;
Кубок: целое числоЧайник: строка = ''

В примере кода этого вопроса Delphi ошибаетсяoverload ключевые слова:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;

думать, что:

я хочу перегрузить мои конструкторы спредок,когда на самом деле я хочу перегрузить его сродной брат

Как скрыть конструктор предка?

Замечания: Может быть невозможно скрыть предшествующий, не виртуальный конструктор, используя язык Delphi, как он определен в настоящее время."Невозможно" правильный ответ

Попытка ответа (не удалось)

i пытался помечая потомков конструкторовreintroduce (возвращаясь к моему режиму случайного добавления ключевых слов, пока он не заработает):

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); reintroduce; overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); reintroduce; overload; virtual;
end;

Но это не сработало, все три конструктора все еще видны. :(

Оригинальный вопрос

у меня есть объект, который происходит от класса, который имеет конструкторы не хотят видеть:

TEniac = class(TObject)
   constructor Create(PowerCord: TPowerCord=nil); //calls inherited Create

TComputer = class(TEniac) ...
   constructor Create(PowerCord: TPowerCord=nil); //calls inherited Create(nil)

TCellPhone = class(TComputer)
   constructor Create(sim: TSimChip; UnlockCode: Integer); //calls inherited Create(nil)

TiPhone = class(TCellPhone)
   constructor Create(sim: TSimChip); //calls inherited Create(sim, 0)

Замечания: Это гипотетический пример. Как и в реальном мире, объекты-предки не могут быть изменены без нарушения существующего кода.

Теперь, когда кто-то используетTiPhone я не хочу, чтобы они даже моглиувидеть конструктор изTEniac:

iphone := TiPhone.Create(powerCord);

Что еще хуже: если они вызывают этот конструктор, они полностью пропускают мой конструктор, и все, что делается между ними. Неправильный конструктор довольно легко вызвать, все они видны в дополнении кода IDE и будут компилироваться:

TiPhone.Create;

и они получают совершенно недействительный объект.

я мог бы изменитьTCellPhone бросить исключение в этих конструкторах:

TCellPhone.Create(PowerCord: TPowercord)
begin
   raise Exception.Create('Don''t use.');
end;

Но разработчики не поймут, что они называют неправильный конструктор, пока клиент однажды не обнаружит ошибку и не оштрафует нас на миллиарды долларов. На самом деле япытаясь чтобы найти везде, я вызываю неправильный конструктор - но я не могу понять, как заставить Delphi сказать мне!

Ответы на вопрос(6)

Ваш ответ на вопрос