How to hide the inherited TObject constructor while the class has overloaded ones?

So long as you have overloaded constructors named Create, you cannot hide the parameterless TObject constructor when deriving from TObject.

This is discussed here: http://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.html

If you are prepared to put another class between your class and TObject you can use Andy Hausladen's trick:

TNoParameterlessContructorObject = class(TObject)
strict private
  constructor Create;
end;

TTest = class(TNoParameterlessContructorObject)
public
  constructor Create(A:Integer);overload;  
  constructor Create(A,B:Integer);overload;  
end;

You can hide the inherited Create by just introducing a non overloaded Create. As you need two overloaded Create, you can either merge those into one Create with an optional second parameter:

TTest = class(TObject)  
public  
  constructor Create(A:Integer; B: Integer = 0); 
end;

This will give a compiler warning, signalling that you're hiding the default parameterless constructor. To get rid of the warning you can declare the hiding constructor like so:

TTest = class(TObject)  
public  
  constructor Create(A:Integer; B: Integer = 0); reintroduce;
end;

or, if this is not feasible, you can introduce an intermediate class introducing the first create and then the final class with the overloaded second one:

preTest = class(TObject)  
public  
  constructor Create(A:Integer); reintroduce;
end;

TTest = class(preTest)  
public  
  constructor Create(A,B:Integer);overload;  
end;

Another option is to use the deprecated keyword and raise an exception at runtime.

TTest = class(TObject)  
public  
  constructor Create; overload; deprecated 'Parameterless constructor is not Supported for a TTest class';
  constructor Create(const A: Integer); overload;  
  constructor Create(const A, B: Integer); overload;  
end;

implementation

constructor TTest.Create;
begin
  raise Exception.Create('Parameterless constructor is not Supported for a TTest class.');
end;

Tags:

Delphi