Обновление: урезал вопрос на более простом примере, на который нет ответа
по первоначально принятому ответу
Дан следующий класс и его предок:
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 сказать мне!