Как скрыть унаследованный конструктор TObject, когда класс перегружен?
Взгляните на этот класс:
TTest = class(TObject)
public
constructor Create(A:Integer);overload;
constructor Create(A,B:Integer);overload;
end;
Теперь, когда мы хотим использовать класс:
var
test: TTest;
begin
test:= TTest.Create; //this constructor is still visible and usable!
end;
Может ли кто-нибудь помочь мне скрыть этот конструктор?
Ответы
Ответ 1
Пока вы перегружаете конструкторы с именем Create
, вы не можете скрыть конструктор без параметров TObject
при выводе TObject
.
Это обсуждается здесь: http://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.html
Если вы готовы поставить другой класс между вашим классом и TObject
, вы можете использовать трюк Andy Hausladen:
TNoParameterlessContructorObject = class(TObject)
strict private
constructor Create;
end;
TTest = class(TNoParameterlessContructorObject)
public
constructor Create(A:Integer);overload;
constructor Create(A,B:Integer);overload;
end;
Ответ 2
Вы можете скрыть унаследованный Create, просто введя неперегруженный Create. Поскольку вам нужно два перегруженных Create, вы можете либо объединить их в один Create с дополнительным вторым параметром:
TTest = class(TObject)
public
constructor Create(A:Integer; B: Integer = 0);
end;
Это даст предупреждение компилятора, сигнализируя, что вы скрываете конструктор без параметров без параметров. Чтобы избавиться от предупреждения, вы можете объявить скрывающий конструктор следующим образом:
TTest = class(TObject)
public
constructor Create(A:Integer; B: Integer = 0); reintroduce;
end;
или, если это невозможно, вы можете ввести промежуточный класс, представляющий первый созданный, а затем конечный класс с перегруженным вторым:
preTest = class(TObject)
public
constructor Create(A:Integer); reintroduce;
end;
TTest = class(preTest)
public
constructor Create(A,B:Integer);overload;
end;