4

タイトルはかなり...

constructorなぜ制約 を使用したいのでしょうか?

それは明らかにclass制約によって暗示されています。

単体で使用すると、作成したもので何もできなくなります。

なぜそれが存在するのですか?

追加情報:

注意として、次のコードは「コンストラクター」制約を追加するまでコンパイルされません。

program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;


type
  TSomeClass<T: class> = class
    function GetType: T;
  end;


{ TSomeClass<T> }

function TSomeClass<T>.GetType: T;
begin
  Result := T.Create;
end;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
4

2 に答える 2

8

なぜコンストラクター制約を使用したいのですか?

これは、クラスの制約によって明確に示されています。

いいえ、ちがいます。コンストラクター制約では、型にパラメーターのないパブリックコンストラクターが必要です。次に、そのコンストラクターを呼び出すことができます。

すべてのクラスにパブリックパラメーターレスコンストラクターがあるわけではありません。

于 2012-11-12T12:44:11.147 に答える
2

私見その制約の公式の理由は、コンパイラが実際にそれを自分で処理できないことです。

これは、コンストラクター制約が必要であるという事実をコンパイラーが認識しているため、自分で設定することもできるコンパイラーの単なるフラグです。Generic クラスはそのクラスを使用する前にコンパイルされるため、コンパイラによって自動的に処理される可能性があります。

たぶん、XE9でそれを取得します

アップデート

TComponent が public パラメータのないコンストラクタなしでクラス型として受け入れられる場合、コンストラクタの制約は役に立ちません。これは、この (Nick からの拡張サンプル) が TComponent インスタンスをコンパイルして生成するためです。もちろん、元のコンストラクタ TComponent.Create( AOwner : TComponent ) は呼び出されず、代わりに TObject.Create が呼び出されますが、TComponent インスタンスがあります。

program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Classes;

type
  TSomeClass<T: class, constructor> = class
    function GetType: T;
  end;

{ TSomeClass<T> }

function TSomeClass<T>.GetType: T;
begin
  Result := T.Create;
end;

var
  SomeClass : TSomeClass<TComponent>;
  Component : TComponent;
begin
  try
    SomeClass := TSomeClass<TComponent>.Create;
    Component := SomeClass.GetType;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

アップデート

TSomeClass<T: class, constructor>

と同じ意味です

TSomeClass<T: constructor>

レコードにはコンストラクターを含めることができますが、パラメーターなしのレコードを含めることはできないため、クラスに対する暗黙の制約があります。そしてこれをひっくり返す

TSomeClass<T: class>

暗黙のコンストラクター制約を持つことができます

于 2012-11-12T17:29:20.270 に答える