Как скрыть унаследованный конструктор TObject, когда класс перегружен? - программирование
Подтвердить что ты не робот

Как скрыть унаследованный конструктор 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;

Может ли кто-нибудь помочь мне скрыть этот конструктор?

4b9b3361

Ответ 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;