25

このクラスを見てください:

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;

誰かがこのコンストラクターを隠すのを手伝ってくれますか?

4

4 に答える 4

23

の名前のコンストラクターをオーバーロードしている限り、から派生するときCreateにパラメーターのないコンストラクターを非表示にすることはできません。TObjectTObject

これについては、ここで説明します:http ://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.html

クラスの間に別のクラスを配置する準備ができていて、 Andy HausladenのトリックTObjectを使用できる場合:

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

TTest = class(TNoParameterlessContructorObject)
public
  constructor Create(A:Integer);overload;  
  constructor Create(A,B:Integer);overload;  
end;
于 2012-12-22T13:27:20.447 に答える
12

オーバーロードされていないCreateを導入するだけで、継承されたCreateを非表示にできます。2つのオーバーロードされたCreateが必要なため、オプションの2番目のパラメーターを使用してそれらを1つの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;

または、これが不可能な場合は、最初の作成を導入する中間クラスを導入し、次にオーバーロードされた2番目のクラスを含む最終クラスを導入できます。

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

TTest = class(preTest)  
public  
  constructor Create(A,B:Integer);overload;  
end;
于 2012-12-22T13:25:33.237 に答える
2

もう1つのオプションは、実行時にdeprecatedキーワードとraise例外を使用することです。

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;
于 2020-02-11T20:43:14.610 に答える
1

2つの継承により、ユーザーによるTMySingletonクラスの作成を、実行時ではなく設計時に防ぐことができます。

unit MySingleton;

interface

uses System.Classes, System.SysUtils;

type
  // Constructor Block external access
  THideConstructor = class abstract
  strict protected
    constructor Create; virtual; abstract;
  end;

  // Switching the access to the Create function THideConstructor in TObject through the constructor Overloading
  // Declaring Create Method as a procedure to prevent class call-TMySingle.Create('string') call impossible
  TOverloadConstructor = class(THideConstructor)
  public
    procedure Create(s: string); reintroduce; overload; deprecated 'null method';
  end;

  TMySingleton = class sealed(TOverloadConstructor)
  private
    class var MyObj: TMySingleton;
  strict protected
    // Hiding TOverloadConstructor.Create(s: string);
    // Implement THideConstructor.Create
    constructor Create; override;
  public
    class function Obj: TMySingleton;
    function Echo(const value: string): String;

    destructor Destroy; override;
  end;

implementation

{ TMySingleton }

constructor TMySingleton.Create;
begin
  // TODO
end;

destructor TMySingleton.Destroy;
begin
   Self.MyObj := nil;
   inherited;
end;

function TMySingleton.Echo(const value: string): String;
begin
  result := value;
end;

class function TMySingleton.Obj: TMySingleton;
begin
  if MyObj = nil then
    MyObj := Self.Create;
  result := MyObj;
end;

{ TOverloadContructor }

procedure TOverloadConstructor.Create(s: string);
begin
  // null method
end;

initialization

TMySingleton.MyObj := nil;

finalization

if Assigned(TMySingleton.MyObj) then
  FreeAndNil(TMySingleton.MyObj);

end.

ユーザーの場合

var
  Singleton: TMySingleton;
begin
  Singleton := TMySingleton.Create;

設計時エラーが発生します。

[dcc32 Error] Unit1.pas(33): E2625 Private member 'THideConstructor.Create' is inaccessible here MySingleton.pas(11): Related method: constructor Create;

ここに画像の説明を入力してください

また、 Createという名前のオートコンプリートヒントは表示されません。

于 2020-11-12T06:49:33.280 に答える