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 сказать мне!